• ベストアンサー

VC++ オリジナルDLLを使用するとアプリを終了させる時にメモリリークする

VisualStudio2005 C++ユーザです。 メモリリークの解決の糸口を探しています。 オリジナルDLLでクラスを作成しそれをオリジナルアプリ側で宣言だけして実行、アプリを閉じると「Detected memory leaks!」と表示されます。 アプリもDLLもデフォルト状態での使用のため、何が原因かさっぱりです。 解決の手引きお願い致します。 ●作成DLL ・DLLの種類>MFC拡張DLL ・クラスはエクスポートするように記述変更  >class AFX_EXT_CLASS CHogehoge : public CObject ・メンバ関数 InitHogehoge() として「int i=0;」のみ記述 ●作成アプリ(MDI形式) ・プロジェクト形式 MFC標準 ・共有DLLでMFCを使用に設定 ・以下のようにクラスの宣言  >例 void CTestApp::OnAppAbout()内にCHogehoge abc;を宣言 ●現象 ・アプリを終了させた時に以下が出力される Detected memory leaks! Dumping objects -> d:\実験\f_tool\f_tool.cpp(53) : {65} client block at 0x003B9028, subtype c0, 64 bytes long. a CDynLinkLibrary object at $003B9028, 64 bytes long a CDynLinkLibrary object at $003B9028, 64 bytes long {59} client block at 0x003B3298, subtype c0, 64 bytes long. a CDynLinkLibrary object at $003B3298, 64 bytes long a CDynLinkLibrary object at $003B3298, 64 bytes long Object dump complete. F_TOOL.DLL Terminating! プログラム '[192] Test.exe: ネイティブ' はコード 0 (0x0) で終了しました。 ●特記事項 エクスポートしたクラス自体は参照出来ているので基本的なミスはないつもり。 出力の「d:\実験\f_tool\f_tool.cpp(53) : {65} client block at ・・・.」はDLL側の「new CDynLinkLibrary(F_TOOLDLL);」行。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • jgk
  • ベストアンサー率75% (104/138)
回答No.2

new CDynLinkLibrary(F_TOOLDLL);はAfxTermExtensionModule(F_TOOLDLL);によって解放されるのですが、出力を見ればわかりますが、解放より前にリークの検出が行われている為にリークが報告されているだけで、メモリリークしてないと思われます。

sakuzo3
質問者

お礼

ありがとうございます。 なるほど!と思いたいのですが、なぜ「解放より前にリークの検出が行われている」のか知りたい気もします・・・。 しかし理屈抜きでも前へ進みたいため今は「そんなもんなんだ」と覚えておきます。

その他の回答 (1)

  • keibou21
  • ベストアンサー率31% (18/58)
回答No.1

よくわかりませんが、 new CDynLinkLibrary(F_TOOLDLL); とCDynLinkLibraryオブジェクトを動的生成してますね。 この生成したオブジェクトをdeleteしていますか?

sakuzo3
質問者

補足

早速の回答ありがとうございます。 このオブジェクトをDeleteするようなことはしていません。 このオブジェクトはDLLMain()内にあるのですが、教科書通りとなっており何も手を入れていません。 ※教科書=「日経BP プログラミング Visual C++.NET Vol.1 基礎編 第20章」 DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) {  // lpReserved を使う場合はここを削除してください  UNREFERENCED_PARAMETER(lpReserved);  if (dwReason == DLL_PROCESS_ATTACH)  {   TRACE0("F_TOOL.DLL Initializing!\n");   // 拡張 DLL を 1 回だけ初期化します。   if (!AfxInitExtensionModule(F_TOOLDLL, hInstance))   return 0;   new CDynLinkLibrary(F_TOOLDLL);  }  else if (dwReason == DLL_PROCESS_DETACH)  {   TRACE0("F_TOOL.DLL Terminating!\n");   // デストラクタが呼び出される前にライブラリを終了します   AfxTermExtensionModule(F_TOOLDLL);  }  return 1; // OK }

関連するQ&A