天天看点

如何管理内存泄露

内容很简单,感觉用的话可以下。

  • 内存泄露的发生的常见情况
  1.  释放超出范围(忘记释放)

    void TestFuc()

  {

int *i = new int; //没有释放

*i = 11;

  }

   或者

  {

               char* str = new char[100]; //没有释放

               strcpy(str,"memory leak");

          }

      2.  丢失指针

class TestClass {

int* val;

public: TestClass() { val = new int;         *val = 11; } ~TestClass() {  delete val; }    }; void foo() { TestClass* a = new TestClass; TestClass* b = new TestClass; a = b; delete a; // 已删除 //delete b; //重复删除

}

3.   错误的使用new/delete

double* d = new double[12]; delete d; // delete d[0]; // 必须使用 delete [] d;

4.   错误释放

int *i; while(someCondition) {

i = new int;

//其他代码 } delete i;

注:比较复杂的是多个对象公用一个new的对象,释放要小心。

  • 如何找的内存泄露的代码
  1. 在使用CPP文件中使用 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

     2.  使用'_CRTDBG_MAP_ALLOC' 

#include <iostream>

#define _CRTDBG_MAP_ALLOC

#include <crtdbg.h>

int main()

{

_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

int* array = new int[10];

return 0;

}

      3.  只有猜测了, 但然也可以借助一些工具。

注:切莫在一个H文件中分配一个空间int *p = new int(p变量可以被外部使用),并在H文件中释放delete p;可是另一处W文件调用p = NULL。 

继续阅读