1

うーん!私はそれらのあいまいなメモリ バグの 1 つを持っていると思います。しかし、よくわかりません。コードの私の部分でさえない可能性があります。MS VC++ 2005 で (C++) アプリケーションをテストしています。現在、コードは例外をスローし、一見無害なベクトル プッシュバックでのヒープ エラーが原因で中断します。

std::vector<int> blah;
for(int i=0; i<somesize; ++i) {
   blah.push_back(0);
}

コードのこのセグメントをどこに移動しても、失敗はまさにプッシュバックで発生します。狂ってる!この使用法に違法性はないと確信しています。また、コメントアウトすると、問題なく通過します。その上下に、問題なくロードできる他のベクトルがあります。それに関連して、これを行うことについて別の質問があります。

std::vector<double*> wha;
wha.push_back(nil);
..
... 
wha[0] = some pointer I create;

私が持っている質問は、何が範囲外になったときに、ポインターを削除するべきではありませんか? 私はそれで正しいと思いますが、明確にしたほうがよいでしょう。申し訳ありませんが、詳細はあまりありませんが、追加の詳細が役立つ場合はお知らせください。さらに投稿してみます. ありがとう。

編集:

正確なエラー メッセージは次のとおりです。

First-chance exception at 0x771b70cd in myprogram_run.exe: Microsoft C++ exception: 
H5::FileIException at memory location 0x08026ca0..
First-chance exception at 0x771b70cd in myprogram_run.exe: Microsoft C++ exception: 
H5::FileIException at memory location 0x08026ca0..
'myprogram_run.exe': Loaded 'C:\Windows\System32\wdmaud.drv', No symbols loaded.
...
...
''myprogram_run.exe': Unloaded '<path\to>\bin\win64-x64-vs2005.shared\tcl85.dll'
The thread 'Win64 Thread' (0x23a8) has exited with code 0 (0x0).
The thread 'Win64 Thread' (0x120c) has exited with code -1 (0xffffffff).
The thread 'Win64 Thread' (0x27bc) has exited with code -1 (0xffffffff).
...
...
HEAP[myprogram_run.exe]: HEAP: Free Heap block dfd6870 modified at dfd68d0 after it was freed
Windows has triggered a breakpoint in myprogram_run.exe.

This may be due to a corruption of the heap, and indicates a bug in myprogram_run.exe or any of 
the DLLs it has loaded.

The output window may have more diagnostic information 
The program '[3052] myprogram_run.exe: Native' has exited with code -1 (0xffffffff).

H5::FileIExceptions について心配する必要がありますか? サードパーティの DLL としてリンクしています。

4

2 に答える 2

3
  1. あなたが投稿したコードは問題ありません。メモリ破損が別の場所で発生した可能性があり、push_backはそれを明らかにしているだけです。
  2. nil削除されません。を使用するたびpush_backに、ポインタのコピーがベクトルにプッシュされます。削除される唯一のものは、ポインターのすべてのコピーを含む内部配列です。
于 2012-06-12T17:02:09.590 に答える
1

一般に、ヒープの破損が発生したときに最初に行うべきことは、何らかの形式の「debug malloc」を有効にすることです。ほとんどのプラットフォームにはこれがあります。

VC++2005 では、どうやら#define _DEBUG. これにより、 malloc() が_malloc_dbg( ) に変わります。これには、デバッグ情報 (ファイル/行など) と、バッファー オーバーラン/アンダーランをチェックするためのパディングが含まれます。CRT デバッグ ヒープも参照してください。

EDIT:それが役に立たない場合(そしてしばしばそうではありません)、各割り当ての後に「ガードページ」を置くデバッグmallocを使用できますlibgmalloc。これは、デバッグ ビルドではデフォルトで有効になっていません。オーバーヘッドが大きいため (割り当てごとに最大 8K まで)、問題のデバッグがはるかに高速になります (そして、malloc()/free()/ へのその後の呼び出しの代わりに、不正なアクセスをキャッチします)。ヒープチェック関数)。

(私は最近、私が何年もの間、おそらく 10年以上もの間我慢してきた ~ 毎週のクラッシュを修正しました! libgmalloc について知っていたので、なぜ以前にこれを行うことができなかったのかわかりません。作業中のヒープの破損をデバッグするために使用されていました。)

于 2012-06-12T18:27:40.420 に答える