本文目录

  • 1 内存分布图
  • 2 C语言和C++内存分配实现
    • 2.1 C语言实现
    • 2.2 C++实现
  • 3 C语言和C++内存管理区别
  • 4 内存泄漏

1 内存分布图


注意:

1.向下生长:地址由高到低
2.向上生长:地址由低到高
3.栈又叫堆栈,非静态局部变量/函数参数/返回值等等
4.堆用于程序运行时动态内存分配

2 C语言和C++内存分配实现

2.1 C语言实现

malloc函数

 void *malloc(size_t size)
  • 分配所需的内存空间,单位是字节,并返回一个指向它的指针。
int* ptr_int = (int*)malloc(4*sizeof(int));//开辟空间
free(ptr_int);//释放空间

calloc函数

void *calloc(size_t nitems, size_t size)
  • 分配所需的内存空间,并返回一个指向它的指针。nitems – 要被分配的元素个数。size – 元素的大小。malloc 和 calloc 之间的不同点是,malloc 不会设置内存为零,而 calloc 会设置分配的内存为零。
char* ptr_char = (char*)calloc(4, sizeof(char));
free(ptr_char);

realloc

void *realloc(void *ptr, size_t size)
  • 尝试重新调整之前调用 malloc 或 calloc 所分配的ptr 所指向的内存块的大小。ptr – 指针指向一个要重新分配内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果为空指针,则会分配一个新的内存块,且函数返回一个指向它的指针。
    size – 内存块的新的大小,以字节为单位。如果大小为 0,且 ptr 指向一个已存在的内存块,则 ptr 所指向的内存块会被释放,并返回一个空指针。
int* ptr_int = (int*)malloc(4*sizeof(int));
char* ptr_char = (char*)calloc(4, sizeof(char));int* ptr_int1 = (int*)realloc(ptr_int, 8 * sizeof(int));
char* ptr_char1 = (char*)realloc(ptr_char, 8 * sizeof(char));

2.2 C++实现


new和delete的实现原理
1 内置类型

  • 如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

2 自定义类型

new的原理

  1. 调用operator new函数申请空间
  2. 在申请的空间上执行构造函数,完成对象的构造

delete的原理

  1. 在空间上执行析构函数,完成对象中资源的清理工作
  2. 调用operator delete函数释放对象的空间

3 C语言和C++内存管理区别

malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:

  1. malloc和free是函数,new和delete是操作符
  2. malloc申请的空间不会初始化,new可以初始化
  3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可
  4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
  5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常
  6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

4 内存泄漏

什么是内存泄漏:
内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。

堆内存泄漏(Heap leak)
堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存,用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak。

系统资源泄漏
指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。

【c++师傅领进门,修行靠个人】第六篇:内存管理相关推荐

  1. [PMP]师傅领进门,修行在个人-致领才PMP学习之旅

    师傅领进门,修行在个人-致领才PMP学习之旅 第一部分 报考"缘"由 选择机构 第二部分 第三部分 第一部分 关键词:机缘巧合 为何要学习PMP (1)随着年龄增长,从技术性人才转 ...

  2. 254work 9月总结复盘:师傅领进门 修行在个人

    圣言:天无绝人之路,毕竟上天没有绝您的事业发展之路啊. 俗人陈六子:然后呢? 不用任何人讲,也知道. 自强不息效法行,力行力行再力行,唯有力行解千愁. 虽然说没有绝您的事业发展路,但这基本上也是您这辈 ...

  3. 体会-师傅领进门修行在个人

    之前发过一排难简单的处理exe病毒的方式.今天徒弟(我的Blog上有她的链接)告诉我她一不小心中了病毒:VIKING.弄了一天多,没用.包括什么专杀工具,全部都不行. 于是又用了以前那招,用Ultra ...

  4. 外汇投资中师傅领进门 修行在个人

    很多人在并未真正接触到外汇投资的时候心里觉着炒外汇的学习不过是多熟悉了解基本面情况,找些相关的书看一看,或者再找个老师亲身指导一番.打个比方,就如同金庸<天龙八部>中的王语嫣,天下武功尽皆 ...

  5. 数字IC笔面基础,师傅领进门,修行靠个人——人人心中都有一个状态机(状态机简介及Verilog模板)

    师傅领进门,修行靠个人(状态机) 写在前面的话 状态机简介 状态机类型 一段.两端还是三段? 状态机的Coding Style要求: 几点规则: 什么是一段.两段.三段? 一段.两段.三段优缺点 Ve ...

  6. 【c++师傅领进门,修行靠个人】第三篇:类和对象

    教你如何new一个对象 1 别急,先来了解你的对象 2 类之初体验 2.1 类的访问限定符 2.2 认识封装 2.3 类的作用域 3 来了,请创建你的对象 4.类对象模型 5 this指针 什么?你告 ...

  7. 【c++师傅领进门,修行靠个人】第一篇:认识c++

    阅读本文你将学到: 1.什么是c++ 2.c++的发展史 3.c++的重要性 4.如何学习c++ 1.什么是c++ C语言是结构化和模块化的语言,适合处理较小规模的程序.对于复杂的问题,规模较大的程序 ...

  8. 【c++师傅领进门,修行靠个人】第五篇:C++类和对象中的一些小细节

    面向对象的总结 1 初始化列表 2 如何突破封装 3 了解静态成员 4 类也能套娃 5 面向对象总结 1 初始化列表 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成 ...

  9. 【c++师傅领进门,修行靠个人】第七篇:C++模板

    目录 1 基本概念 2 函数模板介绍 3 类模板介绍 1 基本概念 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段. ...

最新文章

  1. 搞基础理论研究有什么用?
  2. Git 经常使用命令总结
  3. C#导入Excel2010出现加载DLL失败或者类库未注册的问题,0x8002801D或者0x80029C4A .
  4. 毕业年限不长的前端焦虑和突破方法
  5. OCA第4部分中的Java难题
  6. translateZ 带来的Z-index 问题
  7. [css] scroll-snap-align属性的应用场景是什么?
  8. Windows系统常用技巧总结
  9. SQL Server 2005 实现数据库同步备份 过程--结果---分析
  10. VC++中字符串编码的转换
  11. 我的linux 常用命令
  12. 分布式存储系统可靠性如何估算?
  13. Redis 服务器安装
  14. linux内存源码分析 - 内存回收(整体流程)
  15. 纯php程序无数据,无数据库的详细域名查询程序PHP版(1)_php基础
  16. MFI认证——什么是苹果MFI认证
  17. finecms php7cms,FineCMS评测 是精简版的Phpcms v9?
  18. swfkit打包swf文件步骤(图文教程)
  19. 迎接移动云时代的变革
  20. AE慢动作变速插件:Twixtor Pro for Mac破解版永久激活方法附注册码

热门文章

  1. 《功夫熊猫》经典台词 从来没有什么意外
  2. 相机内存卡数据恢复照片能恢复吗
  3. Puppeteer调用page对象evaluate方法产生的Execution context was destroyed错误处理
  4. 【方法】树莓派小车自动循迹(摄像头)
  5. super,this关键字
  6. 社会主义市场经济的的理论与实践一
  7. SolidWorks 标注怎样设置文字沿引线上下分布
  8. 19年跳槽的你,应该准备点什么呢?
  9. nginx重定向(Redirect)- rewrite
  10. 生成式模型与判别式模型