メモリリークチェック

3650 ワード

Windowsプラットフォームでのメモリ漏洩
CRTDBGの使用
#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK

int main()
{
	char * p = new char[10];
	_CrtMemDumpAllObjectsSince(nullptr); // or _CrtDumpMemoryLeaks();
	return 0;
}

F 5 Debug出力内容:
Dumping objects -> d:\dev\csharptest\cpptest\main.cpp(262) : {236} client block at 0x00265C78, subtype 0, 10 bytes long.  Data: <          > CD CD CD CD CD CD CD CD CD CD Object dump complete.
上のマクロから分かるようにnew再マクロは new(_CLIENT_BLOCK,_FILE_,_LINE_)は、漏洩が発生した割当コード行にナビゲートすることができる.
macro newがない場合は、メモリの漏洩がどれだけあるかを印刷するだけです.
ここでは、CRT Debug Heapについて詳しく説明し、メモリの漏洩を確認します.
まずCRT Debugは,管理コード,すなわちC++のみを対象とする.
CRTDGBを使用するには、ヘッダファイルを以下の順序で参照する必要があります.そうしないと失敗します.
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
マクロ_CRTDBG_MAP_ALLOCの役割はコンパイル期間中にcrtdbg.hを使用したものである.malloc_dbgとfreeは、既存のmallocとfreeの代わりに使用されます.このマクロをdefineしない場合は、newを使用する場所に呼び出しを表示する必要があります.malloc_dbg関数.これも_DEBUGマクロの下でこのエスケープ済みmallocとfreeを使用します.releaseの場合、既存のmallocとfree関数が使用されます.crtdbg.h対_malloc_dbgは再定義され,記録された割り当てメモリの詳細,大少,コードファイルおよび対応する行数である.
void *_malloc_dbg(
   size_t size,
   int blockType,
   const char *filename,
   int linenumber 
);
関数の定義により、sizeはnewが提供する(従来のnewも元のmalloc関数にバイト数を渡す)ため、後の_CLIENT_BLOCK, __FILE__, __LINE__blockType,filename,linenumberにそれぞれ値を割り当てます.
_CrtDumpMemoryLeaks();

この関数は、メモリ漏洩情報をDebugパネルのOutputウィンドウに印刷し、プログラムが終了する前に呼び出す必要があります.プログラムに異常処理が多く、プログラムが終了する可能性のある場所が多い場合は、プログラムエントリで次のコードを使用して、プログラムが終了する前に自動的に呼び出されます.CrtDumpMemoryLeaks()関数.
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

詳細なメモリ割り当てを印刷する必要がある場合は、Statistics関数を使用して、特定の呼び出しメモリ割り当てにナビゲートできます(私は成功しませんでした...)
	_CrtMemState s1, s2, s3;
	char * _p = nullptr;
	_CrtMemCheckpoint(&s1);
	GetMemory(_p, 10);
	_CrtMemCheckpoint(&s2);
	if (_CrtMemDifference(&s3, &s1, &s2))
		_CrtMemDumpStatistics(&s3);
	
は、3つの情報オブジェクトを確立し、メモリ割り当て操作の前後で呼び出し_CrtMemCheckpointは情報をキャプチャし、次に_を使用します.CrtMemDifferenceは両者の情報を比較して_CrtMemDumpStatistics印刷情報.
Visual Leak Detectorの使用
ダウンロード visual leak detectorおよびインストール
環境変数VLDを追加し、プロジェクトのヘッダファイルに$(VLD)includeを追加し、link検索ライブラリに$(VLD)libWin$(PlatformArchiteture)を追加します.
コンパイルコードはDEBUGでプログラムを実行し、メモリ漏洩情報はDEBUGpanelのOutputウィンドウに表示されます.
---------- Block 1 at 0x003B5328: 10 bytes ----------
  Call Stack:
    d:\dev\csharptest\cpptest\main.cpp (121): cpptest.exe!GetMemory + 0x9 bytes
    d:\dev\csharptest\cpptest\main.cpp (262): cpptest.exe!main + 0xB bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (555): cpptest.exe!__tmainCRTStartup + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): cpptest.exe!mainCRTStartup
    0x75B93677 (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
    0x77069F42 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
    0x77069F15 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
  Data:
    CD CD CD CD    CD CD CD CD    CD CD                          ........ ........
は、vldを使用するメリットが上記で見られるように、ライブラリをインストールし、コードでヘッダファイルを参照するだけで、マクロプリコンパイルによってメモリ漏洩チェックを行うかどうかを制御することができます.
Linuxプラットフォームでのメモリ漏洩
補充待ち