【C++入门】内存管理

embedded/2024/9/23 18:18:45/

目录

C++内存区域划分

C++内存管理方式

new 

delete 

operator new和operator delete

new和delete的实现原理

定位new

malloc/free和new/delete的区别


C++内存区域划分

1)栈,又叫堆栈,存放非静态局部变量、函数参数、返回值等,栈是向下增长的(提高空间利用率)。

2)内存映射段,是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。

3)堆,动态分配内存,向上增长。

4)数据段,存储全局数据和静态数据。

5)代码段,存放可执行代码、只读常量。

 

C++内存管理方式

通过new和delete进行动态管理。

1)申请和释放单个内存空间,使用new和delete 。

2)申请和释放连续内存空间,使用new[ ]和delete[ ]。

3)切记匹配起来使用,否则可能会出现意想不到的结果。

new 

1)对于内置类型,new和malloc几乎没啥区别。

2)对于自定义类型,new会调用相应的构造函数,malloc不会。

delete 

1)对于内置类型,delete和free几乎没啥区别。

2)对于自定义类型,delete会调用析构函数完成对象中资源的清理,free不会。

 

operator new和operator delete

1)operator new 和operator delete是系统提供的全局函数。

2)new在底层调用operator new来申请空间,delete在底层调用operator delete来释放空间。

3)operator new实际上是通过malloc来申请空间,operator delete实际上是通过free来释放空间。

4)operator new和operator delete是对malloc和free的封装。

new和delete的实现原理

对于内置类型:

1)new和malloc,delete和free基本类似。

2)new和delete申请和释放的是单个元素的空间,new[ ]和delete[ ]申请和释放的是连续的多个元素空间。

对于自定义类型:

●new的原理

1)调用operator new,operator new调用malloc申请空间。

2)在申请的空间上执行构造函数,完成对象的构造。

●delete的原理

 1)在空间上执行析构函数,完成对象中资源的清理。

 2)调用operator delete,operator delete调用free释放空间。

 

●new T[ N ]的原理

1)operator new[ ]调用operator new,operator new调用malloc开辟空间。

2)在申请的空间上执行N次构造函数。

●delete[ ]的原理 

1)在释放的空间上执行N次析构函数,完成N个对象中资源的清理。

2)delete[ ] 调用operator delete,operator delete调用free释放空间。

定位new

作用:在已分配的内存空间调用构造函数来初始化对象。

格式:new(地址)type或new(地址)type(初始化列表)。

演示:

A* p1 = (A*)malloc(sizeof(A));
new(p1)A; //如果A类的构造函数有参数,则需要传参
p1->~A();
free(p1);A* p2 = (A*)operator new(sizeof(A));
new(p2)A(10);
p2->~A();
operator delete(p2);

malloc/free和new/delete的区别

1)malloc和free是函数,new和delete是操作符。

2)malloc申请的空间不会初始化,new申请的空间可以初始化。

3)malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,如果是多个对象,在[ ]中指定即可。

4)malloc的返回值为void*,在使用时必须强转,new不需要,因为new后跟着就是空间的类型。

5)malloc失败会返回NULL,new失败会抛异常。

6)申请自定义类型时,malloc和free只会开辟和释放空间,不会调用构造函数与析构函数,而new在申请空间时会调用构造函数完成对象的初始化,delete在释放空间前,会调用析构函数完成对象中资源的清理。

 


 完


http://www.ppmy.cn/embedded/7792.html

相关文章

无损以太网的ROCE革命,队列的缓存空间优化分析

ROCE无损以太网,队列的缓存空间优化 多级缓存架构优化芯片性能:* 缓存空间细分为芯片级、端口级和队列级,实现精细管理。* 无损队列引入Headroom缓存空间,确保数据完整性。 在芯片层面: 静态缓存为端口提供保证的缓存空…

设计模式-观察者模式

概述 观察者设计模式(Observer Design Pattern)是一种行为型设计模式,它主要用于解决对象间的一对多依赖问题,当一个对象的状态发生改变时,所有依赖于它的对象都能得到通知并自动更新状态,无需显式调用。该…

一个java项目各个层级的介绍

在springbootmybatisplus的项目中(使用lombok) entity类可以使用Data注解来加入get、set等方法 这里值得注意的是该类实现了Serializable类,目的是实现序列化,在 Java 和其他语言进行通信的时候,需要将对象转化成一种通…

Redis入门

1.初始Redis Redis是一种键值型的NoSql数据库,这里有两个关键字: 键值型 NoSql 其中键值型,是指Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样,可以是字符串、数值、甚至json:…

Node.js

js生成参数,提高定制化能力,需要用到nodejs.更快执行js代码的环境. Node.js和浏览器差距. Node.js可以做到本地文件读写,HTTP网络请求及响应,socket监听请求等;cmd mac系统的功能. 在Node.js上尽量不要执行未知代码. Node.js主要提高性能. 在…

JavaEE 初阶篇-深入了解 I/O 流(FileInputStream 与 FileOutputStream 、Reader 与 Writer)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 I/O 流概述 2.0 文件字节输入流(FileInputStream) 2.1 创建 FileInputStream 对象 2.2 读取数据 2.3 关闭流 3.0 文件字节输出流(FileOutputStream) 3.1 创建 Fi…

浏览器生成Excel文件 ,Apache POI 使用方法及示例

Apache POI 是 Apache 软件基金会的开源项目&#xff0c;它提供 API 用于读取和写入 Microsoft Office 格式的文件&#xff0c;如 Excel、Word 等。在 Spring Boot 应用中&#xff0c;结合使用 Apache POI 可以方便地处理 Excel 文件 一 引入依赖&#xff1a; <dependency&…

【数据结构】顺序表:与时俱进的结构解析与创新应用

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 数据结构与算法 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 一、数据结构的概念 二、顺序表&#xff08;Sequence List&#xff09; 2.1 线性表的概念以及结构 2.2 顺序表分类 …