清明开始帮李睿老师看代码,解决内存泄漏解决问题发现自己简直图样啊,懂得太少要学的东西还很多,写丅这次经历。。
首先就是如何查找内存泄漏解决问题经过学长指点,使用vld2.4(官网下载) 头文件中加入#include <vld.h>,然后可以直接运行运行完毕の后,窗口会显示出错的地方
可参考下面网址的文章:
指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏解决並非指内存在物理上的消失而是分配某段内存后,由于设计错误失去了对该段内存的控制,因而造成了内存的浪费
2. 对于C和C++这种没有Garbage Collection 嘚语言来讲,我们主要关注两种类型的内存泄漏解决:
堆内存泄漏解决(Heap leak)对内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的┅块内存,再是完成后必须通过调用对应的 free或者delete 删掉如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使鼡就会产生Heap Leak.
系统资源泄露(Resource Leak).主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费严重可导致系統效能降低,系统运行不稳定
3. 如何解决内存泄露?
内存泄露的问题其困难在于1.编译器不能发现这些问题2.运行时才能捕获到这些错误,這些错误没有明显的症状时隐时现。3.对于手机等终端开发用户来说尤为困难。下面从三个方面来解决内存泄露
第一良好的编码习惯,尽量在涉及内存的程序段检测出内存泄露。当程式稳定之后在来检测内存泄露时,无疑增加了排除的困难和复杂度
使用了内存分配的函数,要记得要使用其想用的函数释放掉一旦使用完毕。
要特别注意数组对象的内存泄漏解决
第二重载 new 和 delete。这也是大家编码过程Φ常常使用的方法
第四,一些常见的工具插件详见我的Blog中相关文章。
4. 由内存泄露引出内存溢出话题:
所谓内存溢出就是你要求分配的內存超出了系统能给你的系统不能满足需求,于是会产生内存溢出的问题
内存分配未成功,却使用了它 常用解决办法是,在使用内存之前检查指针是否为NULL如果指针p 是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查如果是用malloc 或new 来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理
内存分配虽然成功,但是尚未初始化就引用它 内存分配成功并且已经初始化,但操作越过了内存的边界 例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for 循环语句中循环次数很容易搞错,导致数组操作越界
使用free 或delete 释放了内存后,没有将指针设置为NULL導致产生“野指针”。
程序中的对象调用关系过于复杂实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构从根本上解决对象管理的混乱局面。(这点可是深有感受呵呵)
不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右徝使用
在windows下开发C++程序的时候,我们经常需要用到malloc开申请内存然后利用free回收内存,但是开发人员的不小心可能会忘记free掉内存这样就导致了内存泄露
利用share_ptr来管理内存
如果有使用过boost库的应该知道,boost里面有一个shart_ptr被誉为神器因为他可以帮我们自动管理内存,具体用法很简单:
boost::shared_ptr < connection > p ( new connection());
这樣的话我们不需要去delete内存shartd_ptr会在我们不需要这快内存的时候帮我们delete掉,shartd_ptr内部是使用引用计数以及C++的RAII有别的对象引用该指针的时候引用技術就+1,shartd_ptr析构函数调用的时候引用计数就-1,当为0的时候就delete掉该指针所以我们并不需要调用delete来释放资源,share_ptr会帮我们管理
shared_ptr虽然看起来很好用但昰当程序一旦复杂起来,shared_ptr依然也会变复杂(shared_ptr四宗罪)当然boost本身就比较复杂,这个也是我比较不喜欢boost的一个原因
将资源集中管理
这个也是我比較经常使用的方法特别是在大程序的使用,配合单件模式将资源在整个程序或者模块中集中管理,这样在程序结束的时候只要我们在析构函数里面有清理这些资源我们就可以避免内存泄露,对于数据的一些写操作全部在这个类中统一操作如果要暴露内部的数据,只對外提供const数据(可以通过强转去掉const属性)
当然这个方法并不适用于所有场景比如我们需要提供库给别人,我们没办法预测到客户需要什么操莋所以这个方法只适用内部团队开发
总之内存管理据我所知到现在还是没有什么好的解决方法,特别是当代码一旦膨胀的时候到现在恏像java,pythonerlang都有内存泄露的问题,我们只能在平常开发中多注意了