对于C++的内存泄漏,总结一句话:就是new出来的内存没有通过delete合理的释放掉!

一、程序循环new创建出来的对象没有及时的delete掉,导致了内存的泄露;
代码如下:

#include <iostream>
#include <new.h>using namespace std;void out_of_memroy()
{cout << "ERROR:内存已耗尽!" << endl;
}int main()
{set_new_handler(out_of_memroy);//注意参数传递的是函数的地址;while(1){new int[1000];}return 0;
}

以上代码会在堆区疯狂的动态分配内存空间,导致系统内存耗尽时自动调用set_new_handler参数列表中的函数,打印出ERROR:内存已耗尽!如下图:

二、delete掉一个void*类型的指针,导致没有调用到对象的析构函数,析构的所有清理工作都没有去执行从而导致内存的泄露;
代码如下:

class Object {
private:void* data;const int size;const char id;
public:Object(int sz, char c):size(sz), id(c){data = new char[size];cout << "Object() " << id << " size = " << size << endl;}~Object(){cout << "~Object() " << id << endl;delete []data;}
};

紧接着使我们的main函数:

int main() {
Object* a = new Object(10, 'A');//Object*指针指向一个Object对象;
void* b = new Object(20, 'B');//void*指针指向一个Object对象;
delete a;//执行delete,编译器自动调用析构函数;
delete b;//执行delete,编译器不会调用析构函数,导致data占用内存没有得到回收;cout << "Press any key to continue... ..." << endl;
getchar();
return 0;
}

执行结果如下图:

从执行结果看到,并没有执行b指针(void*)所指对象的析构函数,所以delete一个void*的指针可能会造成内存上的泄露!

三、new创建了一组对象数组,内存回收的时候却只调用了delete而非delete []来处理,导致只有对象数组的第一个对象的析构函数得到执行并回收了内存占用,数组的其他对象所占内存得不到回收,导致内存泄露;
代码如下:

class Object1
{int a;int b;
};int main() {
Object1* arry1 = new Object1[100];//创建包含100个Object1的对象数组arry1并返回数组首地址;
Object1* arry2 = new Object1[100];//创建包含100个Object1的对象数组arry2并返回数组首地址;
delete []arry1;//回收了数组arry1里的所有对象动态创建时占用的内存空间;
delete  arry2;//回收了数组arry2里的第一个对象动态创建时占用的内存空间,导致其他99个对象的内存空间泄露;cout << "Press any key to continue... ..." << endl;
getchar();
return 0;
}

四、未完待续… … ——Powered By Anonymous–V.

C++造成内存泄漏的原因汇总:相关推荐

  1. UWP开发入门(十六)——常见的内存泄漏的原因

    原文:UWP开发入门(十六)--常见的内存泄漏的原因 本篇借鉴了同事翔哥的劳动成果,在巨人的肩膀上把稿子又念了一遍. 内存泄漏的概念我这里就不说了,之前<UWP开发入门(十三)--用Diagno ...

  2. android分析内存工具,Android Studio内存泄漏分析工具汇总

    Android Studio内存泄漏分析工具汇总 时间:2017-04-25     来源:Android开发学习网 在Android开发过程中,让人头疼的就是内存泄露问题了,很小的一个错误都会引起内 ...

  3. Android 中内存泄漏的原因和解决方案

    之前研究过一段时间关于 Android 内存泄漏的知识,大致了解了导致内存泄漏的一些原因,但是没有深入去探究,很多细节也理解的不够透彻,基本上处于一种似懂非懂的状态,最近又研究了一波,发现有很多新的收 ...

  4. 内存泄漏的原因及解决办法_探索内存碎片化 - 第288篇

    相关历史文章(阅读本文之前,您可能需要先看下之前的系列 ) 色谈Java序列化:女孩子慎入 - 第280篇 烦不烦,别再问我时间复杂度了:这次不色,女孩子进来吧 - 第281篇 双向链表,比西天还远? ...

  5. 内存泄漏的原因及解决办法_浅谈 JS 内存泄漏问题

    什么是内存泄漏? 程序的运行需要内存.只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存. 对于持续运行的服务进程(daemon),必须及时释放不再用到的内存.否则,内存占用越来越高 ...

  6. 什么是内存泄漏,常见引起引起内存泄漏的原因,及解决办法

    一:什么是内存泄露 内存泄露是指:内存泄漏也称作"存储渗漏",用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元.直到程序结束.(其实说白了就是该内存 ...

  7. 详细分析内部类的发生内存泄漏的原因

    文章目录 避免内部类中的内存泄漏 步骤1:内部类引用其外部类 步骤2:构造函数获取封闭的类引用 步骤3:声明一种新方法 内存泄漏的解剖 避免内部类中的内存泄漏 使用内部类时要当心垃圾收集 如果您已了解 ...

  8. 内存泄漏的原因及解决办法_编程基础 | C++片段 指针、多态和内存分配

    本片段将介绍运行期而不是编译期的内存分配 1.变量的内存分配和方法的前期绑定 函数中声明的局部变量与其参数以及簿记数据一起被放置在一个活动记录中.活动记录存储在名为运行期栈(run-time stac ...

  9. 内存泄漏的原因及解决办法_内存泄漏的场景和解决办法

    1.非静态内部类会持有外部类的引用,如果非静态内部类的实例是静态的,就会长期的维持着外部类的引用,组织被系统回收,解决办法是使用静态内部类 2.多线程相关的匿名内部类和非静态内部类 匿名内部类同样会持 ...

最新文章

  1. static关键字用法
  2. 7.Odoo产品分析 (二) – 商业板块(3) –CRM(1)
  3. 搜索引擎的两大问题(2) - 相关性
  4. ICO流程,casestudy
  5. Openwrt MiniDLNA 安装方法及 其需要的依赖关系
  6. Win7 MongoDB可视化工具Robo 3T 1.2.1(robomongo)的安装使用
  7. 从C语言的角度重构数据结构系列(五)-C语言的程序结构和基本语法
  8. CSS使用Chrome进行取色
  9. linux mint 最新版,Linux Mint安装最新版R
  10. md5 java代码_JAVA简单实现MD5注册登录加密实例代码
  11. html 滤镜兼容,CSS3 中各种滤镜介绍和兼容性说明 - 文章教程
  12. 10 亿产业基金加持,让精准定位在物联网应用中实现无限可能!
  13. matlab跟maxwell联合优化,sim-sim-maxwell联合仿真遇到问题及解决方法
  14. Cmdkey 凭证管理器工具
  15. 做一个完整的Java Web项目需要掌握的技能[转]
  16. 平衡树(模板+文艺平衡树)
  17. HotSpot虚拟机对象揭秘
  18. 旅游管理系统设计图; 毕业论文概述
  19. 麦克斯韦方程组(彩图完美解释版)
  20. 详解K均值聚类算法(K-means Clustering)简易实例:从空调温度判别使用者

热门文章

  1. 5个设计师必备的页面设计工具!
  2. ​​​​​​​Oracle学习详解02版
  3. 【WMWare 克隆CentOS虚拟机 】解决克隆后 ip 冲突 主机名重复问题
  4. 百度新闻html css代码,仿百度首页XHTML+CSS代码
  5. PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。
  6. 小米手机证书信任设置在哪里_小米手机升级MIUI 12后,记得关闭这4个设置,不然非常耗电...
  7. SSH登录虚拟机慢的问题(等待很久才提示输入密码)
  8. Linux查看文件MD5校验码命令,讲解Linux中校验文件的MD5码与SHA1码的命令使用
  9. b级计算机考试在线试题及答案,计算机等级考试一级B测试题及参考答案
  10. C++修炼之筑基期第二层——构造函数与析构函数