|
|
在mfc中每一个mfc类都类似于带有下面的代码,帮助我们检测时候有内存泄漏的情况:
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
如果发生了内存泄漏,Visual Studio 输出窗口会打印出关于内存泄漏情况的信息。
那么如果不使用 mfc 怎么检测是否发生了内存泄漏呢?
还好微软给我们提供了一个调试苦,只要引用这个库,然后在程序终止之前加上一些代码就可以了。具体步骤如下:
1. 在 StdAfx.h 头文件中引用 #include <crtdbg.h>
2. 在程序终止代码上加上下面的代码:
#ifdef _DEBUG
_CrtDumpMemoryLeaks();
#endif
这一次当程序发生了内存泄漏以后,即使不是 mfc 程序 Visual Studio 也会在输出窗口会打印出关于内存泄漏情况的信息了。
不过上面的程序有些问题,可能会造成误判。比如象下面的程序的内存泄漏实际上就是个假象。因为在main退出之前,mm还没有被释放掉。
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <tchar.h>
#include <crtdbg.h>
#include <map>
int _tmain(int argc, _TCHAR* argv[])
{
typedef std::map<int, int> INT_MAP;
INT_MAP mm;
#ifdef _DEBUG
_CrtDumpMemoryLeaks();
#endif
return 0;
}
and the output window told us:
Detected memory leaks!
Dumping objects ->
{56} normal block at 0x00373C90, 24 bytes long.
Data: < <7 <7 <7 > 90 3C 37 00 90 3C 37 00 90 3C 37 00 CD CD CD CD
Object dump complete.
那么有没有更好的方法呢,答案是有的,看看下面的程序就能解决在main退出后和静态变量都被释放后,是否还有内存被泄漏的报警问题。
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <tchar.h>
#include <crtdbg.h>
#include <map>
int _tmain(int argc, _TCHAR* argv[])
{
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)
| _CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF
| _CRTDBG_DELAY_FREE_MEM_DF);
typedef std::map<int, int> INT_MAP;
INT_MAP mm;
return 0;
}
希望能对大家有所帮助。
|
|