1. 程式人生 > >利用VC/VS檢測程式記憶體溢位(轉)

利用VC/VS檢測程式記憶體溢位(轉)

VisualC++沒有預設啟動記憶體洩露檢測,即如果某段程式碼產生記憶體溢位也不會在“輸出視窗”除錯標籤下輸出記憶體溢位相關資訊

1)需要手工新增程式碼檢測

#define _CRTDBG_MAP_ALLOC//順序改變後 函式可能無法正常工作

#include 
<stdlib.h>

#include 
<crtdbg.h>//可以將函式malloc()和free()對映到對應的除錯板本的_malloc_dbg,_free_dbg, 該函式會跟蹤記憶體分配和釋放
(
2)新增以上程式碼後,可以在程式要檢測記憶體洩露的地方加入函式_CrtDumpMemoryLeaks(),來報告記憶體洩露資訊,如下:

#include 
<stdio.h>//printf等函式的包含檔案#define _CRTDBG_MAP_ALLOC
#include 
<stdlib.h>
#include 
<crtdbg.h>void main()
{
int* iArray=(int*)malloc(sizeof(int));//動態分配空間for(int i=0;i<100;i++)
{
   iArray
=(int*)realloc(iArray,(i+1)*sizeof(int));
   printf(
"%08x",(int)iArray);
   iArray[i]
=i+1;
}
for(i=0;i<
100;i++)
   printf(
"%5d",iArray[i]);
_CrtDumpMemoryLeaks();
//報告記憶體洩露函式}

除錯後,輸出窗口出現

{
153} normal block at 0x00631B90400 bytes long.//記憶體溢位資訊
對應語句為: iArray
=(int*)realloc(iArray,(i+1)*sizeof(int));

(
3)設定CRT報告模式

預設下 _CrtDumpMemoryLeaks輸出洩露記憶體資訊到“輸出視窗”的除錯標籤,這樣較難看出,所以可以用_CrtSetReportMode()進行重置,函式原型:                           int_CrtSetReportMode(
int reportType,int reportMode) reportType有_CRT_WARN,_CRT_ERROR,_CRT_ASSERT;

reportMode有_CRTDBG_MODE_DEBUG\\輸出資訊到除錯標籤頁,

_CRTDBG_MODE_WNDW   \\建立帶有中斷 重試的資訊提示框(建議使用);

和_CRTDBG_MODE_FILE    \\輸出資訊到指定檔案,其中_CrtSetReportFile()函式來定義使用者檔案


4)使用_CrtSetDbgFlag    

對於多出口的程式,每個出口位置都使用_CrtDumpMemoryLeaks();
//報告記憶體洩露函式將會需要輸入很多次,
這時可以使用在程式開始處包含如下語句

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEN_DF,_CRTDBG_LEAK_CHECK_DF)     即如下程式無論從哪退出都可以自動呼叫_CrtDumpMemoryLeaks();檢測.
轉自:http://hi.baidu.com/pro_hc/blog/item/dcddc0f2c7d8ef5b342acc2e.html