什么是内存泄露,如何避免内存泄露 C++

定义

  • 内存泄露(memory lock)是指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。

进一步解释

  • 内存泄露其实并非指内存再物理上的小时,而是在应用程序分配某段内存后,由于涉及错误,死去了对该内存的控制,因而造成了内存的浪费。
  • 一般常说的内存泄露是指堆内存的泄露,堆是动态分配内存的,并且可以分配使用很大的内存,使用不好会产生内存泄露,使用不好会产生内存泄露。频繁的使用malloc和free会产生内存碎片(类似磁盘碎片)。
  • 一般使用malloc、calloc、realloc、new等函数从堆中分配到一块内存,使用完后,也应该对应的调用free或delete来释放内存块,否则这块内存就不能再次使用,造成内存泄露
  • 对new或malloc出的指针进行重新赋值,也会导致内存泄露

避免内存泄露

  • 方法1:内部封装

参考:https://blog.csdn.net/yes_I_am/article/details/51182971

程序内存分配中栈区和堆区的特点不同,栈区的数据生命周期结束时系统会自动回收栈上的内存,而堆上的内存由程序员自己分配,堆上数据的生命周期结束时系统不会自动回收它的内存,而是需要程序员手动释放,这样就很容易造成内存泄露。

想要避免内存泄露就需要用到栈和堆的特性,以及C++析构函数的特性,在C++中,当class对象的生命周期结束时,class对象会自动调用自己的自购函数来释放类实例化时构造函数所申请的内存空间。

具体方法

将动态内存的申请放在类的构造函数中,然后在类的析构函数中手动释放构造函数申请的内存空间,最后将class对象定义在程序栈上。这样在class对象生命周期结束时,系统会自动回收栈上class对象所占的内存,同时class对象在他的生命周期结束时将会自动调用自己的析构函数来释放构造函数申请的堆内存空间,这样就可以间接地使用程序栈来管理分配的内存,也间接地避免了程序运行过程中内存的泄露。

代码实现

参考:http://www.cppblog.com/kangnixi/archive/2010/02/15/107878.aspx

  • 方法2:智能指针

参考:https://blog.csdn.net/xt_xiaotian/article/details/5714477

参考:http://www.cnblogs.com/xiehongfeng100/p/4645555.html#autoid-1-0-0

参考:https://www.cnblogs.com/lanxuezaipiao/p/4132096.html

对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,在栈对象生命期即将结束时,智能指针通过析构函数释放有它管理的堆内存。自C++11起,C++标准提供两大类型的智能指针:

  1. Class shared_ptr实现共享式拥有(shared ownership)概念。多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用(reference)被销毁”时释放。为了在结构复杂的情境中执行上述工作,标准库提供了weak_ptr、bad_weak_ptr和enable_shared_from_this等辅助类。
  2. Class unique_ptr实现独占式拥有(exclusive ownership)或严格拥有(strict ownership)概念,保证同一时间内只有一个智能指针可以指向该对象。一旦拥有者被销毁或变成空,或开始拥有另一个对象,先前拥有的那个对象就会被销毁,其任何相应资源也会被释放。它对于避免资源泄露(resource leak)--例如“以new创建对象后因为发生异常而忘记调用delete”--特别有用。

    注:C++98中的Class auto_ptr在C++11中已不再建议使用。

使用智能指针的原因

  1. 智能指针能够帮我们处理资源泄露问题;
  2. 它也能够帮我们处理空悬指针的问题;
  3. 它还能够帮我们处理比较隐晦的由异常造成的资源泄露。

C++内存管理

参考:https://blog.csdn.net/zhanghefu/article/details/5003407

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值