- ベストアンサー
VS2010でDetected memory leaks!が発生しています。対処方法を教えてください。
- VS2010を使用している際に、Detected memory leaks!が多発しています。
- いくつかは修正できましたが、特定の場所の意味が分からず困っています。
- 他の回答によると、_CrtDumpMemoryLeaksの実行場所を後にすることで対策できるそうですが、プロジェクトには明示的に記述されていません。アドバイスをお願いします。
- みんなの回答 (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行目にブレークを貼ってコールスタックを追う。 等から追跡して、そのデータの確保タイミングを見つける位は出来るかも知れません。 この手の事例は単に生成順と解放順が管理されていない事による不整合が大半だと思います。 綺麗にクラス化された設計なら、該当しそうなオブジェクトのデストラクタと、新オブジェクトのコンストラクタにトレースなりブレークを貼って、順番のおかしい箇所を探すのが、地味で手間に見えますが確実です。 リークは大変ですよね。 起きた際の事後解決能力も必要ですが、起こさない為の工夫も、考えると山ほどあります。 是非がんばって下さい。
お礼
お礼が遅れ、申し訳ありません。 丁寧な回答ありがとうございます。 アドバイスいただいた内容をもとに、リーク箇所を探してみたいと思います。