windows下定位内存泄漏

主要是使用了_CrtDumpMemoryLeaks和_CrtSetBreakAlloc函数

由于win32有界面的程序不能打印,所以需要将打印的数据输出到文件中,代码如下:

#include <atlstr.h>

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
	_In_opt_ HINSTANCE hPrevInstance,
	_In_ LPTSTR    lpCmdLine,
	_In_ int       nCmdShow)
{

	_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);

	char* p = new char[10];


	char* q = new char[5];

	char* a = new char[2];

	delete[] p;

	HANDLE hLogFile;//声明日志文件句柄
	hLogFile = CreateFile(L"error.log", GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);//创建日志文件
	_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
	_CrtSetReportFile(_CRT_WARN, hLogFile);//将日志文件设置为告警的输出文件

	_CrtDumpMemoryLeaks();//Dump从程序开始运行到该时刻点,已分配而未释放的内存(重要函数!!!!)
	return 0;
}

输出文件内容如下:

Detected memory leaks! Dumping objects ->
{130} normal block at 0x001168D8, 2 bytes long.
Data: < > CD CD
{129} normal block at 0x001167F0, 5 bytes long.
Data: < > CD CD CD CD CD Object dump
complete.

{130}和{129}代表了第130、129次内存分配操作发生了泄漏,所以根据这两个信息,可以定位到内存泄漏的位置,可以添加如下代码:

#include <atlstr.h>
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
	_In_opt_ HINSTANCE hPrevInstance,
	_In_ LPTSTR    lpCmdLine,
	_In_ int       nCmdShow)
{

	_CrtSetBreakAlloc(130); //当运行到此内存泄漏的地方会直接中断程序

	char* p = new char[10];

	char* q = new char[5];

	char* a = new char[2];

	delete[] p;

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值