windows下如何定位內存泄露問題
工具:VS2010
環境:windows7
以下操作適用於debug模式
頭文件
添加以下內容到應用程序
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include<stdlib.h>
#include<crtdbg.h>
#endif
函數介紹
_CrtDumpMemoryLeaks(): 在程序退出點之前調用此函數會在輸出中產生內存泄露信息,但是如果程序有多個退出點則無需在所有退出點都調用該函數,取而代之的是在main()一開始就首先調用:
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
這樣程序會在退出前自動調用long _CrtSetBreakAlloc( long lBreakAlloc ); 在指定內存分配點設置斷點。
官網:
代碼
// memory_leak.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include<stdio.h>
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include<stdlib.h>
#include<crtdbg.h>
#endif
void MyTestFunc()
{
char *p = new char[100];
memcpy(p, "this is a test", sizeof("this is a test"));
printf(p);
}
int _tmain(int argc, _TCHAR* argv[])
{
//_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
//_CrtSetBreakAlloc(127); //取消註釋,可以在程序運行到分配第多少個內存時停下來。這裏是127
MyTestFunc();
_CrtDumpMemoryLeaks(); //打印內存泄露信息,一般在一個過程結束打印
return 0;
}
相關步驟截圖
1.設置參數,在可疑點調用函數_CrtDumpMemoryLeaks();,設置斷點,在輸出窗口查看問題。
2.記住這裏的127,取消第二行註釋,設置參數爲127。重新調試。
3.觸發內存泄露斷點,點擊中斷,查看調用棧信息。
這樣就定位到問題了。
調試時,可以使用_RPTn宏將信息輸出到輸出窗口,n爲顯示參數
舉例:
_RPT0(_CRT_WARN,"text");
_RPT1(_CRT_WARN,"%d", iTest);
_RPT2(_CRT_WARN,"%d,%f", iTest,fTest);
....依次類推
總結:
實際項目中,需要排除法,定位問題位置。
儘量不要使用滿屏幕的指針。
使用智能指針管理創建的對象。
參考文章:
https://blog.csdn.net/sky1203850702/article/details/42027791