搜索总结c++ 内存泄露问题

  师兄的项目上现在存在很多的料想不到的错误,在交流过程中,他说很多都是绕过去了,没有仔细的去纠察原因。于是我就在想内存泄露的问题影响到了项目出现了未知的错误,搜索关键词C++内存泄露,有很多前辈总结出来常见的容易出现内存泄露的地方,我在阅读的时候,结合自己的写代码习惯,还真了解不少我在代码编写过程中出现的问题,下面贴出搜索到的关键部分:

  http://blog.csdn.net/wenhm/article/details/4314863

  1. 指针成员变量分配了内存一定要释放;
    ~CApple()
    {
           if(NULL != m_ptrData)
           {
               delete m_ptrData;
               m_ptrData = NULL;
           }
    }
    
    //需要提醒的是:上面删除m_ptrData再置NULL,是一个良好的编程习惯,可以避免产生野指针。
    //(当然这里对象都析构了不存在这个问题,但其它很多地方将删除的指针置NULL是非常明智的一个做法,
    //不然鬼知道这个指针指向的内存是否是有效的)
  2. 若不是在定义指针代码作用范围内,使用其它地方定义的指针时(比如全局指针,类成员变量指针),进行赋值操作的时候先判断原来指针是否有值,有则先释放原来的内存。
  3. 公共模块一般有init()、open()和release()、terminate()、close()两种类型的函数,不要忘记扫尾类型函数的调用。
  4. 若正常分支有内存需要释放,则不要忘了异常分支的内存释放如try语句的catch分支,函数中的多个return分支都要考虑到相应内存的释放。
  5. 动态分配的对象数组,记得使用delete[]来进行删除。基于两个考虑:

    (1)可以释放整个数组的空间;

    (2)调用数组中每个对象的析构函数。
  6. 不是采用常规内存分配(new、malloc、calloc、realloc)的内存也要记得释放,如strdup等。

    有一些C/C++ Api返回的指针是动态分配的需要使用者来负责释放,这个只要使用时看清楚Api的说明就不会有什么问题了。

  7. 最好在程序退出时释放内存,虽然OS会回收,但对于我们以后内存泄漏检测工作能带来极大方便。
  8. 一个类的指针被向上引用,作为基类的指针来使用的时候,把析构函数写成虚函数。这样做是为了当用一个基类的指针类型来删除一个派生类的对象时,派生类的析构函数会被调用。(new子类的对象,删除时却采用delete父类类型的指针。new CConcreteClass的对象ptr,但delete CClass类型的指针ptr,无法调用正确的析构函数)

  在QT中可以看到很多指针new后没有delete:

  参看博文《从 Qt 的 delete 说开来 》解释了为什么在示例工程中看到了很多new,而没有看见对应多的delete的原因。

原文地址:https://www.cnblogs.com/galuo/p/4058791.html