内存泄漏

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。导致产生“野指针”。

程序中的对象调用关系过于复杂,实在难以搞清楚某个对象到底是否已经释放了内存,此时应该又一次设计数据结构,从根本上解决对象管理的混乱局面。(这点但是深有感受,呵呵)

不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值