现在项目组交给我一个程序,里面有少量的内存泄露。但由于代码量很大不是特别好跟踪。在郁闷的时候,翻了下高端调试,看到可以将泄漏检测出来并输出到文件。我在高端调试上面只看到介绍了API,并没有讲解例子。于是查了下msdn写了一下代码:
在OnInitDialog()函数写下 _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG);
void CMemoryLeakDlg::OnOK() { // TODO: Add extra validation here
Test1(); Test2(); Test3(); Test4(); HANDLE hLogFile = CreateFile("./memleak.log", GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);//创建日志文件 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);//将warn级别的内容都输出到文件 _CrtSetReportFile(_CRT_WARN, hLogFile);//将日志文件设置为告警的输出文件 CloseHandle(hLogFile); }
BOOL CMemoryLeakDlg::Test1() { char *p = new char; return TRUE; }
BOOL CMemoryLeakDlg::Test2() { char *p2 = new char; delete p2; return TRUE; }
struct a { int c; int b; };
BOOL CMemoryLeakDlg::Test3() { a* pp = new a; return TRUE; }
BOOL CMemoryLeakDlg::DestroyWindow() { // TODO: Add your specialized code here and/or call the base class
return CDialog::DestroyWindow(); }
void CMemoryLeakDlg::Test4() { int *c = new int; }
程序每次退出的时候都会将泄漏文件名和行号记下并写入到memleak.log中。这里要有2个疑问:
1 我点击完ok按钮,程序响应ONOK函数的时候。为什么没有立刻将泄漏输出呢?
2 我强行结束掉进程,程序是不会写dump文件的。有没有什么好的解决办法。
|