搜索总结c++ 内存泄露问题
师兄的项目上现在存在很多的料想不到的错误,在交流过程中,他说很多都是绕过去了,没有仔细的去纠察原因。于是我就在想内存泄露的问题影响到了项目出现了未知的错误,搜索关键词C++内存泄露,有很多前辈总结出来常见的容易出现内存泄露的地方,我在阅读的时候,结合自己的写代码习惯,还真了解不少我在代码编写过程中出现的问题,下面贴出搜索到的关键部分:
http://blog.csdn.net/wenhm/article/details/4314863
- 指针成员变量分配了内存一定要释放;
~CApple() { if(NULL != m_ptrData) { delete m_ptrData; m_ptrData = NULL; } } //需要提醒的是:上面删除m_ptrData再置NULL,是一个良好的编程习惯,可以避免产生野指针。
//(当然这里对象都析构了不存在这个问题,但其它很多地方将删除的指针置NULL是非常明智的一个做法,
//不然鬼知道这个指针指向的内存是否是有效的) - 若不是在定义指针代码作用范围内,使用其它地方定义的指针时(比如全局指针,类成员变量指针),进行赋值操作的时候先判断原来指针是否有值,有则先释放原来的内存。
- 公共模块一般有init()、open()和release()、terminate()、close()两种类型的函数,不要忘记扫尾类型函数的调用。
- 若正常分支有内存需要释放,则不要忘了异常分支的内存释放如try语句的catch分支,函数中的多个return分支都要考虑到相应内存的释放。
-
动态分配的对象数组,记得使用delete[]来进行删除。基于两个考虑:
(1)可以释放整个数组的空间;
(2)调用数组中每个对象的析构函数。 -
不是采用常规内存分配(new、malloc、calloc、realloc)的内存也要记得释放,如strdup等。
有一些C/C++ Api返回的指针是动态分配的需要使用者来负责释放,这个只要使用时看清楚Api的说明就不会有什么问题了。
- 最好在程序退出时释放内存,虽然OS会回收,但对于我们以后内存泄漏检测工作能带来极大方便。
-
一个类的指针被向上引用,作为基类的指针来使用的时候,把析构函数写成虚函数。这样做是为了当用一个基类的指针类型来删除一个派生类的对象时,派生类的析构函数会被调用。(new子类的对象,删除时却采用delete父类类型的指针。new CConcreteClass的对象ptr,但delete CClass类型的指针ptr,无法调用正确的析构函数)
在QT中可以看到很多指针new后没有delete:
参看博文《从 Qt 的 delete 说开来 》解释了为什么在示例工程中看到了很多new,而没有看见对应多的delete的原因。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。