利用VC/VS檢測程式記憶體溢位(轉)
阿新 • • 發佈:2019-02-05
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 0x00631B90, 400 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
(1)需要手工新增程式碼檢測
#define _CRTDBG_MAP_ALLOC//順序改變後 函式可能無法正常工作
#include <stdlib.h>
#include <crtdbg.h>//可以將函式malloc()和free()對映到對應的除錯板本的_malloc_dbg,_free_dbg, 該函式會跟蹤記憶體分配和釋放
(2)新增以上程式碼後,可以在程式要檢測記憶體洩露的地方加入函式_CrtDumpMemoryLeaks(),來報告記憶體洩露資訊,如下:
#include
#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<
printf("%5d",iArray[i]);
_CrtDumpMemoryLeaks();//報告記憶體洩露函式}
除錯後,輸出窗口出現
{153} normal block at 0x00631B90, 400 bytes long.//記憶體溢位資訊
對應語句為: iArray=(int*)realloc(iArray,(i+1)*sizeof(int));
(3)設定CRT報告模式
預設下 _CrtDumpMemoryLeaks輸出洩露記憶體資訊到“輸出視窗”的除錯標籤,這樣較難看出,所以可以用_CrtSetReportMode()進行重置,函式原型: int_CrtSetReportMode(
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