1

複数のダイナミック リンク ライブラリのソリューションでは、基本的に 1 つのライブラリ "MyLibrary.dll" のみでヒープの破損が毎回発生しますが、"MyOtherLibrary.dll" については言うまでもありません。関連するコード:

HINSTANCE hModule;

hModule = LoadLibrary("MyLibrary.dll");

// hModule is checked and definitely valid  

if(hModule)
{
    FreeLibrary(hModule);   // HeapCorruption occurs now, but ONLY for "MyLibrary.dll"
}

何が問題なのか本当にわかりません。VSプロジェクトの設定で何かを変更する必要があるように思えますが、何を変更するのか、その理由はわかりません。ライブラリ内のコードの一部でもありますか?

追加情報: 「MyLibrary.dll」のプロジェクトは CMake 2.8 で作成され、Visual Studio 2010 SP1 で正常にビルドされました (ただし、プロジェクト「MyOtherLibrary.dll」も同様です)。

誰でも助けてもらえますか?

4

2 に答える 2

3
 // HeapCorruption occurs now, but ONLY for "MyLibrary.dll"

コメントが間違っています。それは言うべきです

 // HeapCorruption is detected now.

これは非常に一般的なシナリオです。コードが終了すると、しばらく使用されていたメモリが解放される可能性があります。コード内のポインタ バグやバッファ オーバーフローによってメモリが破損する可能性が十分にあります。または、EXE と DLL が異なる CRT バージョンを使用している場合は、デバッグ ヒープから診断を取得します。この種のヒープの損傷は、ヒープ マネージャーがそのメモリにアクセスして解放する必要があるまで、検出されません。それではカブーン。

から入手できるデバッグ アロケータを使用し<crtdbg.h>て、その種の破損を早期にキャッチします。一般に、ヒープ破損のバグをトラブルシューティングするために使用できる多くのデバッグ ツールがあります。

于 2013-06-07T10:07:18.520 に答える
0

かなり長い検索 (非 MVP にとっては本当に苦痛でした) の後、一部のユーザーが既に推測して回答したように、ランタイム ライブラリに関連していることが判明しました。

しかし、実際の問題は、リンクしているランタイム ライブラリ (libcmt.lib) 自体ではなく、プロジェクトで無視するように設定したランタイム ライブラリ (libcmtd.lib ではありませんでした) でした。

このマイクロソフトのページによると、使用しているライブラリに応じて、どのライブラリを無視するかを注意深く監視する必要があります。なぜリンカーの警告が発生しなかったのか疑問に思っています..しかし、それは別のトピックです。

とにかく、あなたの助けに感謝します!

于 2013-06-11T08:42:14.857 に答える