什么是内存泄露,如何避免内存泄露 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++标准提供两大类型的智能指针:
- Class shared_ptr实现共享式拥有(shared ownership)概念。多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用(reference)被销毁”时释放。为了在结构复杂的情境中执行上述工作,标准库提供了weak_ptr、bad_weak_ptr和enable_shared_from_this等辅助类。
- Class unique_ptr实现独占式拥有(exclusive ownership)或严格拥有(strict ownership)概念,保证同一时间内只有一个智能指针可以指向该对象。一旦拥有者被销毁或变成空,或开始拥有另一个对象,先前拥有的那个对象就会被销毁,其任何相应资源也会被释放。它对于避免资源泄露(resource leak)--例如“以new创建对象后因为发生异常而忘记调用delete”--特别有用。
注:C++98中的Class auto_ptr在C++11中已不再建议使用。
使用智能指针的原因
- 智能指针能够帮我们处理资源泄露问题;
- 它也能够帮我们处理空悬指针的问题;
- 它还能够帮我们处理比较隐晦的由异常造成的资源泄露。
C++内存管理
参考:https://blog.csdn.net/zhanghefu/article/details/5003407
什么是内存泄露,如何避免内存泄露 C++相关推荐
- 如何使用Eclipse内存分析工具定位内存泄露
本文以我司生产环境Java应用内存泄露为案例进行分析,讲解如何使用Eclipse的MAT分析定位问题 一. 背景 11月10号晚上8点收到报警邮件,一看是OOM 打开公司监控系统查看应用各项指标发现J ...
- 内存泄露排查之线程泄露
作者:mrguozp https://www.cnblogs.com/guozp/p/10597327.html 基础 内存泄露(Memory Leak) java中内存都是由jvm管理,垃圾回收由g ...
- drools规则引擎因为内存泄露导致的内存溢出
进入这个问题之前,先了解一下drools: 在很多行业应用中比如银行.保险领域,业务规则往往非常复杂,并且规则处于不断更新变化中,而现有很多系统做法基本上都是将业务规则绑定在程序代码中. 主要存在的问 ...
- java中为什么还要防止内存泄露_JAVA防止内存的泄漏什么意思,内存还能泄露?...
展开全部 尽管java虚拟机和62616964757a686964616fe59b9ee7ad9431333166353066垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄 ...
- 转载浅谈MFC内存泄露检测及内存越界访问保护机制
2019独角兽企业重金招聘Python工程师标准>>> 本文所有代码均在VC2008下编译.调试.如果您使用的编译器不同,结果可能会有差别,但本文讲述的原理对于大部分编译器应该是相似 ...
- openssl内存分配,查看内存泄露
openssl内存分配 用户在使用内存时,容易犯的错误就是内存泄露.当用户调用内存分配和释放函数时,查找内存泄露比较麻烦.openssl提供了内置的内存分配/释放函数.如果用户完全调用openssl ...
- android弹出输入法内存,android 输入法导致内存泄露问题
该方法侵入太高,必须重新EditText,如果我们直接使用一个第三方的控件包含了EditText,那么这么做就没有意义,所以放弃了这种方案,然后我又想出了其他方案,Android 输入法导致内存泄露以 ...
- java 多线程 内存泄露_关于内存泄露的总结
大致先分为五个小模块: 1.什么是内存泄漏 2.有哪些情况会导致内存泄漏切如何解决 3.如何检测内存泄漏 4.Java得基本数据类型和占用字节 5.什么是内存溢出和解决办法 一.什么是内存泄漏(Mem ...
- linux 进程内存分析工具,Linux内存使用情况以及内存泄露分析之工具与方法
1. 内存使用情况分析 1.1 系统总内存分析 通过cat /proc/meminfo,可用的物理内存=MemFree+Buffers+Cached. MemTotal: 5933132 ...
- linux内存管理、分析、泄露定位与工具整理
linux内存管理.分析.泄露定位与工具整理 linux内存管理相关知识 1. 进程的内存申请与分配 2. 当前系统总内存的统计 linux内存分析 linux内存泄漏相关知识 内存泄露的分类 val ...
最新文章
- 被声明为已否决 解决方法
- 全球及中国盘式削片机行业运营模式与“十四五”投资规划建议报告2022-2027年版
- 64位系统上安装apache
- 通过jquery-ui中的sortable来实现拖拽排序
- kmeans python自定义初始聚类中心_机器学习-KMeans聚类 K值以及初始类簇中心点的选取...
- python mro文件_Python MRO
- Java案例:编译器生成桥方法
- 雷军:执掌金山纯属意外
- Eclipse 创建自己的Wokspace和C++ Project
- Imagej分析所有气泡的粒径
- linux下vi命令大全,linux系统vi命令详解
- 【操作系统】CPU调度算法
- html调色板快捷键,12款web前端最佳调色板工具
- 用excel制作双层饼图_Excel中怎么绘制双层饼图?
- 坚果云 我的电脑图标_坚果云使用教程
- 学习!嵌入式底层驱动工程师学习方法
- HighNewTech:元宇宙(metaverse)的简介(多角度理解与探讨)、发展历史、现状与未来
- 单片空间后方交会程序c语言,摄影测量实习报告-单片空间后方交会
- 计算机控制面板 关机时间,怎么设置电脑的自动关机时间
- ACM图灵奖现状以及得主及其分别分别的贡献