0

私のプログラムでは、std::listオブジェクトへのポインターがあり、そのように割り当てられています。

d_list_p = new std::list<some_type*>();

その後、プログラムの後半で、そのように削除します。

d_list_p->clear();
delete d_list_p;

何らかの理由で、delete ステートメントで Windows ブレークポイントがトリガーされます。delete ステートメントでブレークすると、リストが存在し、サイズが 0 であることがわかります。また、エラーがスローされる場合に備えて、リストに要素を追加することはありません (と思います)。

コードは、VS2005 用の MS VC++ コンパイラでコンパイルされています。

エラー メッセージには、Windows がメモリの破損を示すブレークポイントをトリガーしたことが示されています。スタック トレースには、次のように記載されています。

ntdll.dll!DbgBreakPoint()   
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
ntdll.dll!RtlpNtMakeTemporaryKey()  + 0x6735 bytes  
ntdll.dll!RtlpNtMakeTemporaryKey()  + 0x6b72 bytes  
ntdll.dll!RtlpNtMakeTemporaryKey()  + 0x7d5a bytes  
ntdll.dll!LdrAlternateResourcesEnabled()  + 0x33bd bytes    
ntdll.dll!RtlpUnWaitCriticalSection()  + 0x65b bytes    
msvcr80.dll!free()  + 0xcd bytes    
FM_Access_Library_NET.dll!std::list<FM_Access_Library::Logger_Callbacks *,std::allocator<FM_Access_Library::Logger_Callbacks *> >::`scalar deleting destructor'()  + 0x20 bytes C++

この削除ステートメントは、.NET DLL に組み込まれている C++ コードに含まれているため、プログラムは混合モードで実行されていることに注意してください。

4

3 に答える 3

4

d_list_pクラスのメンバーですか?そして、そのクラスは 3 つのルールを守っていますか?

そうでない場合は、(のコピー)d_list_pが既に削除されている可能性があります。

于 2011-09-08T17:02:32.273 に答える
3

リストを反復処理し、リスト内のすべての個々のポインターも削除する必要があります。そうしないと、それらがリークされるためです。

そして、なぜstd :: listへのポインタを作成しているのですか?使用するだけstd::list<mytype> mylist;

于 2011-09-08T16:56:18.080 に答える
0

を呼び出すと、Windowsはヒープをダブルチェックするdeleteため、delete行はエラーを作成するのではなく、エラーを見つけています。エラーは上記の行にあります。
ほとんどのヒープ破損は、(A) delete の呼び出し回数が多すぎる、(B) 間違った形式の delete の呼び出し、または (C) 範囲外のヒープ割り当て配列へのアクセスによって引き起こされます。A と B が問題ではないことがわかります。したがって、おそらく C です。配列アクセスを見つけて、範囲を検証するためにアサートを囲みます。

于 2011-09-08T17:06:59.717 に答える