如果类的析构函数在main函数返回后调用,内存泄漏检测函数应该放在这个析构函数的末尾。
举例说明如下。
下面程序实际没有内存泄漏,但由于 _CrtDumpMemoryLeaks 函数放的位置不对,而检测有内存泄漏。
#define _CRTDBG_MAP_ALLOC #include <crtdbg.h> #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif #include<stdio.h> #include<stdlib.h> class A { private: void* p; public: A () { printf("in A::A\n"); p = malloc(100); } virtual ~A () { free(p); printf("in A::~A\n"); getchar(); } }; int main() { A a; getchar(); _CrtDumpMemoryLeaks(); return 0; }
检测结果:
Detected memory leaks!
Dumping objects ->
e:\test.cpp(18) : {55} normal block at 0x00392950, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
如果把 _CrtDumpMemoryLeaks 函数放到析构函数 A::~A() 里,就不提示内存泄漏了,结果就正常了。如下:
#define _CRTDBG_MAP_ALLOC #include <crtdbg.h> #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif #include<stdio.h> #include<stdlib.h> class A { private: void* p; public: A () { printf("in A::A\n"); p = malloc(100); } virtual ~A () { free(p); printf("in A::~A\n"); getchar(); _CrtDumpMemoryLeaks(); } }; int main() { A a; getchar(); return 0; }