1.什么事内存泄漏
指因为疏忽或者错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,而对该段内存失去了控制,因而对内存造成了浪费。
2.对于C/C++这样没有Garbage Collection(垃圾回收机制)的语言来讲,有两种类型的泄漏
堆内存泄漏:对内存指的是程序执行中依据需要分配通过malloc,realloc,new等从堆中分配的一块内存,再是完毕之鸥必须通过调用相应的free或者delete删掉。假设程序的设计的错误到这这部分内存没有被释放,那么此后这块内存将不会再被使用,就会产生堆内存泄漏。
系统资源泄漏:主要指程序使用系统分配的资源比如Bitmap,handle,SOCKET等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定
3.怎样解决内存泄露?
内存泄露的问题其困难在于
1.编译器不能发现这些问题。
2.执行时才干捕获到这些错误,这些错误没有明显的症状,时隐时现。
3.对于手机等终端开发用户来说,尤为困难。以下从三个方面来解决内存泄露:
第一,良好的编码习惯,尽量在涉及内存的程序段,检測出内存泄露。当程式稳定之后,在来检測内存泄露时,无疑添加了排除的困难和复杂度。使用了内存分配的函数,要记得要使用其想用的函数释放掉,一旦使用完成。
第二,重载 new 和 delete。这也是大家编码过程中常用的方法。
相当于一个内存池。内存池
4. 由内存泄露引出内存溢出话题:
所谓内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是会产生内存溢出的问题。
常见的溢出主要有:
内存分配未成功,却使用了它。 经常使用解决的方法是,在使用内存之前检查指针是否为NULL。假设指针p 是函数的參数,那么在函数的入口处用assert(p!=NULL)进行检查。假设是用malloc 或new 来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理。
内存分配尽管成功,可是尚未初始化就引用它。 内存分配成功而且已经初始化,但操作越过了内存的边界。 比如在使用数组时常常发生下标“多1”或者“少1”的操作。特别是在for 循环语句中,循环次数非常easy搞错,导致数组操作越界。
使用free 或delete 释放了内存后,没有将指针设置为NULL。导致产生“野指针”。
程序中的对象调用关系过于复杂,实在难以搞清楚某个对象到底是否已经释放了内存,此时应该又一次设计数据结构,从根本上解决对象管理的混乱局面。(这点但是深有感受,呵呵)
不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。