Skip to content

MS_VCPlusPlusMemoryLeak

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

VC++のメモリ・リーク

概要

VC++のメモリ・リークについて。

詳細

補足: 元 Wiki は概要と参考リンクのみ。以下は補足として追記した内容。

典型的な原因

原因 内容
new / deletemalloc / free の不一致 確保と解放の対応漏れ。new[] には delete[] を使う。
例外による解放のスキップ 途中で例外が飛び、delete に到達しない。
循環参照 std::shared_ptr 同士が参照し合い、参照カウントが 0 にならない。
ハンドル リーク CloseHandle / ReleaseDC などの解放漏れ。メモリ以外のリソース リーク。
COM の参照カウント Release 漏れ。

実装での予防

  • RAII を徹底する(std::unique_ptr / std::shared_ptrCComPtr など)。
    生ポインタでの所有権管理をやめれば、上記の多くは構造的に起きなくなる。
  • 循環参照になる側は std::weak_ptr にする。

検出

  • CRT デバッグ ヒープ
    デバッグ ビルドで _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF) を設定すると、
    プロセス終了時に未解放ブロックが出力ウィンドウに表示される。
    _CrtSetBreakAlloc(<割り当て番号>) でその確保位置に止められる。
  • Visual Studio の診断ツール(メモリ使用量のスナップショット比較)
  • 本番環境ではUMDHWinDbg!heap 系コマンド
    (事前にグローバルフラグでページ ヒープ/スタックトレース DB を有効化)。

参考


Tags: 障害対応, 性能, デバッグ

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally