我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++内存管理看这一篇就够了

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++内存管理看这一篇就够了

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。

系统资源泄漏

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

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++内存管理看这一篇就够了

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【C++】Cmake使用教程(看这一篇就够了)

文章目录 引言一 环境搭建二 简单入门2.1 项目结构2.2 示例源码2.3 运行查看 三 编译多个源文件3.1 在同一个目录下有多个源文件3.1.1 简单版本3.1.1.1 项目结构3.1.1.2 示例代码3.1.1.3 运
2023-08-16

Redis是什么?看这一篇就够了

本文由葡萄城技术团队编撰并首发转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。引言在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来
Redis是什么?看这一篇就够了
2020-08-08

Python中计时,看这一篇就够了

计时对于了解程序的性能是很关键的部分。本文讨论了Python 2和python 3中计时方法,并完成了一个通用的计时装饰器。一、python2和python3的通用计时方法由于python2和3里面的计时函数是不一样的,建议使用timeit
2023-01-31

Docker Volume的用法看这一篇就够了

Docker卷是一种持久存储机制,允许容器访问主机或容器中的数据。有绑定卷(连接主机目录)和命名卷(独立文件系统)两种类型。使用卷的优点包括数据持久性、共享和灵活性。要创建卷,使用命令"dockervolumecreate<卷名称>",要附加到容器,使用命令"dockerrun-v<卷名称>:<容器路径><镜像名称>"。最佳实践包括优先使用命名卷,避免在同一卷中存储重要和临时数据,并定期清理不需要的卷。
Docker Volume的用法看这一篇就够了
2024-04-02

C++ Cmake使用详细教程(看这一篇就够了!)

CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目,下面这篇文章主要给大家介绍了关于C++ Cmake使用的相关资料,需要的朋友可以参考下
2023-03-07

strncpy函数详解看这一篇就够了C语言

strncpy函数是C语言中的字符串处理函数,用于将一个字符串复制到另一个字符串中,可以指定复制的长度。函数原型:```cchar* strncpy(char* dest, const char* src, size_t n);```参数解
2023-09-09

什么叫 SSH ?原理详解,看这一篇就够了!

SSH(Secure Shell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录或文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的安全隐患。随着人们对网络安全的重视,这些方式
2023-08-03

Java迭代器详解,看这一篇就够了

文章目录 🚩Java 迭代器详解📚迭代器的定义📒认识Iterator✏️类结构图✒️Iterable接口🖍️Iterator接口📃Iterat
2023-08-19

软考那些事儿看这一篇就够了!

  近几年来,各行各业的职业资质考试持续发热,其中,软考的报名人数更是一马当先逐年暴增。说起软考证书,大概还有很多朋友都不大认识,甚至还有这样的疑问:为什么这么多人考软考?软考是什么?今天小希就为大家详细介绍下“软考”,一起来看看吧~  软考的前世今生  计算机软件资格考试(即“软考
软考那些事儿看这一篇就够了!
2024-04-19

Mac zsh: command not found: pyinstaller。[看这一篇就够了]

文章目录 一、问题总结与解决方法。1) pyinstaller版本问题2) 安装后仍然显示command not found2.1) macOS Catalina(10.15) 之前系统。2.2) macOS Catalina(10
2023-08-19

python操作Excel神器openpyxl看这一篇就够了

Python使用openpyxl读写excel文件这是一个第三方库,可以处理xlsx格式的Excel文件,下面这篇文章主要给大家介绍了关于python操作Excel神器openpyxl的相关资料,需要的朋友可以参考下
2023-05-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录