如果类的析构函数在main函数返回后调用,内存泄漏检测函数应该放在这个析构函数的末尾。

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


 

你可能感兴趣的:(如果类的析构函数在main函数返回后调用,内存泄漏检测函数应该放在这个析构函数的末尾。)