當(dāng)調(diào)試情況下運(yùn)行程序時(shí),在輸出窗口的Debug 標(biāo)簽處_CrtDumpMemoryLeaks表現(xiàn)出內(nèi)存泄漏的信息。內(nèi)存泄漏信息類似下面這樣: Detected memory leaks! Dumping objects -> C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20) : normal block at 0x00780E80, 64 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.
假如你沒有用#define _CRTDBG_MAP_ALLOC說明,內(nèi)存漏洞堆存處類似下面這樣: Detected memory leaks! Dumping objects -> normal block at 0x00780E80, 64 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.
在內(nèi)存分配數(shù)目處設(shè)置一個(gè)斷點(diǎn) 在內(nèi)存泄漏報(bào)告中的文件名和行號(hào)可告訴你泄漏的內(nèi)存在那里被分配,但是了解內(nèi)存在那里分配對(duì)于鑒定問題不總是充分的。在一個(gè)程序運(yùn)行過程中,經(jīng)常是一個(gè)分配將會(huì)被調(diào)用很多次,但是它可能在某次調(diào)用中泄漏內(nèi)存。為了確定問題,你必須不但知道泄漏的內(nèi)存在那里分配,還要知道泄漏發(fā)生的條件。對(duì)你來說,使它成為可能的那條信息是內(nèi)存分配號(hào)。當(dāng)那些被顯示的時(shí)候,文件名和行號(hào)之后,這是在curly brace中出現(xiàn)的數(shù)值。例如,在下面的輸出中,"18"是內(nèi)存分配號(hào)。它的意思是泄漏的內(nèi)存是你程序中內(nèi)存分配的第十八個(gè)模塊。 Detected memory leaks! Dumping objects -> C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20) : normal block at 0x00780E80, 64 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.
此函數(shù)打印出類似于下面這樣的一堆內(nèi)存分配信息: 0 bytes in 0 Free Blocks. 0 bytes in 0 Normal Blocks. 3071 bytes in 16 CRT Blocks.
0 bytes in 0 Ignore Blocks. 0 bytes in 0 Client Blocks. Largest number used: 3071 bytes. Total allocations: 3764 bytes.
為了確定一個(gè)內(nèi)存泄漏是否在一節(jié)代碼中出現(xiàn),你可以在此節(jié)前和此節(jié)后對(duì)內(nèi)存狀態(tài)作快照,然后用_CrtMemDifference比較兩種狀態(tài): _CrtMemCheckpoint( &s1 ); // memory allocations take place here _CrtMemCheckpoint( &s2 );
if ( _CrtMemDifference( &s3, &s1, &s2) ) _CrtMemDumpStatistics( &s3 );