如果类的析构函数在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;
}