• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Detected memory leaks!)

VS2010でDetected memory leaks!が発生しています。対処方法を教えてください。

このQ&Aのポイント
  • VS2010を使用している際に、Detected memory leaks!が多発しています。
  • いくつかは修正できましたが、特定の場所の意味が分からず困っています。
  • 他の回答によると、_CrtDumpMemoryLeaksの実行場所を後にすることで対策できるそうですが、プロジェクトには明示的に記述されていません。アドバイスをお願いします。

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

  • ベストアンサー
  • vector01
  • ベストアンサー率50% (1/2)
回答No.1

初めまして。ゲーム業界でメインPGやっている者です。プログラマ歴は10年位です。 エラーメッセージから推測するに、CRTデバッガが吐き出すリーク検知時のメッセージでしょうか。 (メモリアロケータ等は自作でCRT等のツールは使った事無いので分かりませんが・・) コードが無いので何とも言えませんが、そのメッセージ自体は調べたところ、 MFCのstrcore.cpp156行目の処理によるエラーで34985回目のメモリ確保時に出ている様です。 (3万回以上経ってなら、大方のリークは潰した後の小さなリークの累積なんでしょうね。骨が折れている事と思います) その際のメモリ確保はヒープ上の0x05ECE620と言うアドレスから始まっていますが、104バイトのメモリブロックが未解放。 (解放していないメモリブロック上に確保をかけて失敗している) そして、その失敗しているメモリブロックの中身は、}R+ + となっている。 その}R+ + をバイナリとして表すと、84 CF 7D 52 2B 00 00 00 2B 00 00 00 01 00 00 00 と言うのが直訳した結果です。 VC上のIDEであればヒープ位置は変わらないと記憶しているので、 ・0x05ECE620と言う数値が何度実行しても変わらないのであればそのアドレスが変更された際にブレークをかける ・104バイト確保と言う事なので、そのサイズの構造体やクラスに心当たりが無いか考える ・使用している実値データに84 CF 7D 52 2B 00 00 00 2B 00 00 00 01 00 00 00が無いか ・MFCのstrcore.cppが見えるなら156行目にブレークを貼ってコールスタックを追う。 等から追跡して、そのデータの確保タイミングを見つける位は出来るかも知れません。 この手の事例は単に生成順と解放順が管理されていない事による不整合が大半だと思います。 綺麗にクラス化された設計なら、該当しそうなオブジェクトのデストラクタと、新オブジェクトのコンストラクタにトレースなりブレークを貼って、順番のおかしい箇所を探すのが、地味で手間に見えますが確実です。 リークは大変ですよね。 起きた際の事後解決能力も必要ですが、起こさない為の工夫も、考えると山ほどあります。 是非がんばって下さい。

mtsm
質問者

お礼

お礼が遅れ、申し訳ありません。 丁寧な回答ありがとうございます。 アドバイスいただいた内容をもとに、リーク箇所を探してみたいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 起動時に何のダイアログも表示されない

    こんにちは。 大変恐縮ですがこちらで質問させてください。 開発環境はVC2005のMFCです。 質問内容は題名の通りなのですが、デバッグを実行しても何のダイアログが表示されない という状態になってしまいました。 すぐにデバッグが終了してしまいます。(「デバッグなしで開始」でも同様です。) プロジェクトはダイアログベース、スタティックライブラリ、ソケットを使える設定で 作成しました。 プロジェクトを作成してから他ダイアログを作り全てのダイアログに新しくボタンを配置したのと、初期配置のOK,キャンセルボタンを削除した以外は、コード上に手を加えるなどはしていません。 また、以下のようなエラーコードが出力されました。 Dumping objects -> f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\occmgr.cpp(195) : {75} normal block at 0x003496B8, 488 bytes long. Data: < > E8 03 00 00 00 00 00 00 E9 03 00 00 00 00 00 00 {74} normal block at 0x00349580, 248 bytes long. Data: < > FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 Object dump complete. プログラム '[1528] test.exe: ネイティブ' はコード 0 (0x0) で終了しました。 何か原因と対策等がわかりましたら回答をいただければと思います。 よろしくお願いします。

  • メモリリークについて

    VC6.0でデバッグ実行すると Detected memory leaks! Dumping objects -> ソースファイル名(932) : {136739} normal block at 0x00FD4AC0, 0 bytes long. Data: <> メッセージがあり メモリがリークしているようです メッセージやソースから察するに 0バイトの領域を確保し それを解放したときに起こっているようです 領域をmallocして 解放ではNULLでなければ解放 という処理はしてはいけないことなのでしょうか 0バイトの領域を確保した場合 又は0バイトの領域を確保しないように 処理しないといけないのでしょうか? 知識のある方よろしくお願い致します

  • 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);」行。 宜しくお願い致します。

  • _dupenv_s関数でメモリリーク

    VC++2005のMFCにてアプリを作成しています。 環境変数「TEST_ENV」の値を「OFF」にあらかじめ設定し、 _dupenv_s()関数にて変数の値を読込むプログラムなのですが、 プログラムをデバッグモードで実行し出力欄を見ると、 「Detected memory leaks!」と表示され、 原因箇所を探ると、どうやら ============================================== char* pGetEnv; size_t len; _dupenv_s( &pGetEnv, &len, "TEST_ENV" );←ここ ============================================== にて発生しているようです。 MSDNによると、lenにはバッファ容量を指定とあるので、 原因として、lenに何も指定されておらず、リークが発生していると考え、 Webで方法を色々調べたのですが、どのサイトも同じような書き方で、 解決法が分かりません。 どなたかご存知の方おられましたら、ご教授お願い致します。 なお下記にメッセージログを記載します。 Detected memory leaks! Dumping objects -> {73} normal block at 0x003A7018, 4 bytes long. Data: <OFF > 4F 46 46 00

  • メモリリークの件

    メモリリークについて教えてください。 最近VC++を勉強中なのですが、メモリリークというものを知り、_CrtDumpMemoryLeaks()をしたところ、以下のコメントが出力されました。 [コメント] Detected memory leaks! Dumping objects -> strcore.cpp(118) : {71} normal block at 0x00344978, 20 bytes long. Data: < cmd.> 01 00 00 00 07 00 00 00 07 00 00 00 63 6D 64 2E {48} client block at 0x003428E8, subtype 0, 64 bytes long. a CDynLinkLibrary object at $003428E8, 64 bytes long {43} client block at 0x00342720, subtype 0, 64 bytes long. a CDynLinkLibrary object at $00342720, 64 bytes long {41} client block at 0x003425D0, subtype 0, 64 bytes long. a CDynLinkLibrary object at $003425D0, 64 bytes long Object dump complete. スレッド 0x584 終了、終了コード 0 (0x0)。 上記のコメントから、メモリリークを起こしていることはわかりました。ただ、strcore.cppというクラスは作成していないのですが、エラーが出ます。 多分他の関数から呼ばれているクラスだと思うため、クラス等をコメントアウトして調べたのですが、エラーがまだ出力されます。 (Data: < cmd.> 01 00 00 00 07 00 00 00 07 00 00 00 63 6D 64 2Eここは自作クラス上の問題だと思います。) newとかの解放はしているのですが、他にメモリリークをする原因ってあるのでしょうか?

  • Visual Studio2008でのメモリリーク

    プログラムを組んでいて、終了すると 以下のようなメモリリークがでました。 desktop\emptyproject ?d?a?E?μ\dxut\core\dxut.cpp(3385): DXUTCleanup3DEnvironment hr=DXUTERR_NONZEROREFCOUNT (0x80040904) D3DX: MEMORY LEAKS DETECTED: 363 allocations unfreed (322368 bytes) D3DX: Set    HKLM\Software\Microsoft\Direct3D\D3DXBreakOnAllocId=0x1a35 to debug MSDNでは DXUTERR_NONZEROREFCOUNT Direct3D デバイスがゼロ以外のリファレンス カウントを持っているため、一部のオブジェクトが解放されませんでした。 とありますが、この意味もよく分かりません。 今までのメモリリークは Dumping objects -> {343} normal block at 0x0207F288, 2240 bytes long. のように割り当てられたブロックが分かりましたが、 上の様なメモリリークは初めてで、 文からメモリリークの原因を検出することができないでいます。 何故、下ではなく上の様なエラー文になるんでしょうか?

  • メモリリーク?どう回避すれば。。。

    Visual Studio 2005 SP1(Vista 64bit)で開発しているのですが、実行時に固まってしまうので、デバッグをかけたところ終了時に f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\plex.cpp と出てメモリリークだと表示されました。 64ビットアプリの開発中でわからないことだらけです。 上記のメモリリークはどのように回避すればよいのでしょうか?

  • DLしたコードの使い方は?

    よろしくお願いします。 親切にソースコードをDLさせてくれるサイトがあります。 DLしたファイルの中にプロジェクトファイル(○○○.dsw)があればそれをダブルクリックすれば良いのですが、無い場合でa.cpp、b.cpp、a.h、b.h・・・とソースコードのみの場合はどのようにしてビルド実行すればよいのですか? ご存知の方、よろしくお願いします。

  • 学校PCで問題なくデバッグできるのに自宅PCのくVisual Studioでは同じソースがデバッグできません。

    学校PCで作成しているC++ MFCアプリを自宅PCでも修正できるよう同じくVisual Studioを買ったのですが、同じソリューション、同じソースなのに家PCでだけデバッグ時にエラーが出ます。 学校環境:デスクトップ Windows XP Pro SP2 Visual Stuidio 2005 Academic Edition 家環境:ノート Windows XP Pro SP2 Visual Stuidio 2005 Academic Edition (同じ) プロジェクトのディレクトリごとコピーし、ソリューションファイルを開いてデバッグすると以下のダイアログが出ます。 Debug Assertion Faild! Program: c:\プログラム名\debug\プログラム名.exe File:f:\rtm\vctools\vc7libs\ship\atlmfc\src\occcont\cpp Line:950 For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application) 中止 再試行 無視 環境は同じはずですが…。家PCにFドライブはありません。学校PCには仮想ドライブとしてFはありますが何もマウントしていません。家PCのVC++で簡単なMFCアプリを作ると無事デバッグ出来ます。このままではVS買った意味がありません…。 「ソリューションのリビルド」「(プログラム名)のリビルド」してから「デバッグ」してもダイアログが発生します。両リビルド自体にはエラーはでません。デバッグ時のみ出ます。

  • C++ visualstudio グローバル変数

    C++のプログラミングに関する質問です。 visual studio2008を使用しています。 手元に非常に複雑なC++ファイルなどから構成されている1つのprojectがあります。(ヘッダファイルなどもあります) そのため、このprojectをデバッグすると、A.cppファイルをデバッグ→B.cppファイルをデバッグ→A.cppファイルをデバッグ→C.cppファイルをデバッグのように、色々なcppファイルを跨ってデバッグします。 1つのcppファイルには大量の関数があり、cppファイルの先頭や,関数外の部分に例えばA.cppで int test などと宣言すれば、A.cppファイル内ではtestと名付けた変数をすべての関数で使えます。 しかし、あくまでA.cppファイル内だけで使用できるだけで、別のBやC.cpp内で使うことはできません。 このtest変数をB.cppやC.cppファイルでも使えるようにするにはどうすればいいでしょうか? 上で挙げた例でいうなら、A.cppからB.cppファイルに移動する際の関数の引数として渡す方法は考えられますが、実際には、 test変数を使いたいのはかなり後に登場するcppファイルで関数の引数として扱うのは非常に大変です。 (Z.cppでtest変数を使いたい。しかしZ.cppに到達するまでにはA~Y.cppを通り、その間に登場するすべての関数でtestを引数にしなければならない) 関数の引数でtest変数を使えるようにする以外の方法がありましたたら教えていただけると幸いです。 実際にやりたいことは A.cpp内にある関数が実行されたらその数をカウントし(A.cppのこの関数は何度も呼び出される関数) //count ++ このcount++の値によってZファイルのある関数での動作を変えたいと思っています。 if(count<100){ printf("aaa"); } しかし、現状ではZ.cppファイル内ではcountが定義されていないので上のようなif文を書くとエラーになってしまいます。