主要是使用了_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;
}