1

私のプログラムは ([] 演算子] を使用して) いくつかのデータ [アドレス] を std::map に挿入しています。137 個の要素の挿入を追跡できます。それらはすべて有効な値で挿入されます。

ある段階で、マップを反復し、マップの反復を開始する直前にブレークポイントを設定した値[アドレス] を操作しようとします。デバッガーでマップを確認すると、まだ 137 個の要素が表示されます。

iterator != map.endマップに 138 個の値があることを発見しました - 最後の値は違法です。

この最後の問題のある値がいつ挿入されたかを検出する方法を見つける必要があります。私は VS 2010 を使用しています。

ありがとうございました

4

2 に答える 2

6

デバッグのためだけに、メンバー関数をデバッグ情報を出力するstd::mapラッパー クラスに置き換えることができます。std::map::insert

#include <map>
#include <iostream>
#include <utility>
#include <string>

template<class Key, 
         class Value, 
         class Compare = std::less<Key>, 
         class Allocator = std::allocator<std::pair<const Key, Value>>>
struct wrap_map : std::map<Key, Value, Compare, Allocator>
{
  typedef std::map<Key, Value, Compare, Allocator> base_type;

  std::pair<iterator,bool> insert( const value_type& value )
  {
    std::cout << "Inserted: [" << value.first << "] : " << value.second << std::endl;
    return base_type::insert( value );
  }
};

int main()
{
  wrap_map<int, std::string> mymap;

  mymap.insert( std::make_pair( 10, std::string( "Hello, World!" ) ) );
  std::cout << mymap[10] << std::endl;
}

出力:

Inserted: [10] : Hello, World!
Hello, World!

std::map::insertコードで使用しているの他のオーバーロード、およびstd::map::operator[]それを使用して要素をマップに挿入する場合は、オーバーロードを作成する必要があります。

__LINE__挿入が行われている場所を示すなどのマクロを出力することもできます。

std::mapには仮想デストラクタがないため、マップを動的に割り当てる場合、このアプローチを使用すると、どこでも型名をwrap_map.

于 2012-08-31T20:09:06.907 に答える
3

の挿入関数に条件付きブレークポイントを配置してみてください。std::map

私の場合 (VC10 を使用)、適切な場所はC:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xtree の755 行目 ( の場合std::map::insert) と 767 行目 ( の場合) です。std::map::operator[]

サイズを 138_Mysize == 137に増やす挿入をキャッチするために、各ブレークポイントに条件を追加できます。map

operator[]これをアクセサーのみと誤解しやすいため、最も可能性の高い原因はおそらくです。

于 2012-08-31T20:11:37.793 に答える