3

Windows 7 で Visual Studio 2008 を使用して、C++ でコーディングしています。

アプリケーションにメモリ リークがあり、システム モニタで確認できます。

コードでそれを発見する必要があります。

呼び出しプロセスに割り当てられたメモリ量を返す関数は存在しますか?

4

1 に答える 1

4

memleak 検出に対する MSVC 固有のソリューションがあります

// enable memory leaks detection
#if !defined(NDEBUG)
HANDLE hLogFile = CreateFile( "log.txt", GENERIC_WRITE, FILE_SHARE_WRITE,
                              NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
#endif

_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_WNDW  | _CRTDBG_MODE_DEBUG );
_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE   | _CRTDBG_MODE_DEBUG );
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE  | _CRTDBG_MODE_WNDW  | _CRTDBG_MODE_DEBUG );

_CrtSetReportFile( _CRT_ASSERT, hLogFile );
_CrtSetReportFile( _CRT_WARN,   hLogFile );
_CrtSetReportFile( _CRT_ERROR,  hLogFile );

int tmpDbgFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpDbgFlag |= _CRTDBG_ALLOC_MEM_DF;
tmpDbgFlag |= _CRTDBG_DELAY_FREE_MEM_DF;
tmpDbgFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpDbgFlag );

if ( BlockIndex > 0 )
{
    _CrtSetBreakAlloc( BlockIndex );
}

この不気味なコードは、すべての未割り当てブロックのファイル プロトコルを有効にします。もちろん、MSVCRTのデバッグ版とも深く結びついています

于 2012-05-20T22:07:21.790 に答える