博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
什么是内存泄露,如何避免内存泄露 C++
阅读量:4147 次
发布时间:2019-05-25

本文共 1392 字,大约阅读时间需要 4 分钟。

定义

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

进一步解释

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

避免内存泄露

  • 方法1:内部封装

参考:

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

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

具体方法

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

代码实现

参考:

  • 方法2:智能指针

参考:

参考:

参考:

对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,在栈对象生命期即将结束时,智能指针通过析构函数释放有它管理的堆内存。自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++内存管理

参考:

转载地址:http://yfvti.baihongyu.com/

你可能感兴趣的文章
【Python基础6】格式化字符串
查看>>
【Python基础7】字典
查看>>
【Python基础8】函数参数
查看>>
【Python基础9】浅谈深浅拷贝及变量赋值
查看>>
Jenkins定制一个具有筛选功能的列表视图
查看>>
【Python基础10】探索模块
查看>>
【Python】将txt文件转换为html
查看>>
[Linux]Shell脚本实现按照模块信息拆分文件内容
查看>>
idea添加gradle模块报错The project is already registered
查看>>
在C++中如何实现模板函数的外部调用
查看>>
在C++中,关键字explicit有什么作用
查看>>
C++中异常的处理方法以及使用了哪些关键字
查看>>
如何定义和实现一个类的成员函数为回调函数
查看>>
内存分配的形式有哪些? C++
查看>>
什么是内存泄露,如何避免内存泄露 C++
查看>>
栈和堆的空间大小 C++
查看>>
什么是缓冲区溢出 C++
查看>>
sizeof C++
查看>>
使用指针有哪些好处? C++
查看>>
引用还是指针?
查看>>