Windows下如何定位內存泄露問題

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 ); 在指定內存分配點設置斷點。

官網:

_CrtSetDbgFlag()

_CrtDumpMemoryLeaks()

_CrtSetBreakAlloc

代碼

// 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章