2011-07-07 1 views
5

私は空のベクトルを持っています。何かがそれをどこかで満たしていて、見つけることができません。 push_backが発生したときにプログラムが中断するように、メモリブレークポイントを設定したい。ベクトル<int>の長さが長くなるときのブレークポイントを設定するにはどうすればよいですか?

私はVisual Studio 2008を使用していますが、問題はベクトルがウォッチウィンドウに内部メンバーを表示しないことです(カスタムフォーマットがあるようです)。それはちょうど次のようになります。

myVector [0]()のstd ::ベクトル< int型、のstd ::アロケータ<整数>>

示すサイズ0の任意のヒント?

+0

なぜpush_backにブレークポイントを設定しないのですか? – JonathonW

+0

それは悪くないが、サイズ変更、割り当てなどのような他のケースをキャッチしませんでした。しかし、ありがとう! – baddie

+0

ベクトルには仮想関数はなく、メンバは3つしかありません。 1つはポインタ、1つは割り当てサイズ、もう1つは実際にベクトル内の要素の数です。実際のクラスレイアウトを知らなくても(ちょうどヘッダーで調べることはできますが)試してみるとメモリアドレスを見付けるのが難しくありません(おそらく 'vec + sizeof(void *)') – Damon

答えて

5

この回答はVS 2010用です。詳細は他のバージョンと異なる場合があります。

デバッガはstd::vectorの状態を表示するためにデータビジュアライザ(またはそれが呼び出されたもの)を使用するため、<vector>ヘッダーを調べて、クラスの実際のメンバーの名前と、要素の数を追跡する責任があります。これを行う簡単な方法は、vector::push_back()を呼び出すことです。

VC++ 2010では、これはメンバーポインタ_Mylastです。

したがって、書き込み時にデータブレークポイントを&v._Mylast(ここではvがデバッグに興味のあるベクトル)に設定するだけです。

要素が次回追加されたとき、デバッガは正確にどこにコールスタックがあるかでブレークします。

0

VC2010に0を示し、[0]はベクトルのサイズを示し、項目は()内に表示されます。 とメモリ出力ウィンドウを使用してメモリアドレスを見つけることができます。

関連する問題