C++内存管理

news/2024/10/31 3:28:21/

内存管理

c:malloc、calloc、realloc、free

c++:new(不会初始化)、delete

内存管理方式

对于内置类型

//申请和释放单个元素的空间,使用new和delete操作符
int* p1 = new int;//申请1个int类型的空间
delete p1;int* p2 = new int(0);//申请1个int类型的空间并初始化为0
delete p2;//申请和释放连续的空间,使用new[]和delete[]
int* p3 = new int[10];//申请10个int的空间
delete[] p3;int* p4 = new int[10]{0};//申请10个int的空间,全都初始化为0
delete[] p4;

对于内置类型,new/delete相比malloc/free,除了用法不一样,没有其他区别。

对于自定义类型

// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。

底层实现(不是重载!)

new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

operator new

operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,尝试执行空间不足应对措施,如果该应对措施用户设置了,则继续申请,否则抛bad_alloc异常。

char* p1 = new char[1024*1024*10];
等价于
char* p1 = (char*)operator new(1024*1024*10);

但平时直接用new就行,new的底层就是封装了malloc并能抛出异常。

operator delete

operator delete: 该函数最终是通过free来释放空间的。

placement new

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。

使用格式:
new (place_address) type或者new (place_address) type(initializer-list)。其中place_address必须是一个指针,initializer-list是类型的初始化列表。

A* p1 = (A*)malloc(sizeof(A));// p1现在指向的只不过是与A对象相同大小的一段空间,还不能算是一个对象,因为构造函数没有执行
if(p1 == nullptr) {}
new(p1)A;// 注意:如果A类的构造函数有参数时,此处需要传参
----上述代码相当于下面一句----
A a1 = new A;

定位new是在内存池处使用。池化技术,是为了提高效率,如果项目中要频繁向堆申请空间,就可以考虑使用池化技术。


http://www.ppmy.cn/news/6040.html

相关文章

jenkins pipeline 指定执行节点

第一种写法: pipeline { agent { label “slave-hw” } stages { stage(‘执行更新程序包’) { steps { sh ‘cd /apps/nedy/nedy/csctbb/HWCLOUD ; sh test.sh’ } } stage(‘是否继续’) { steps { input message: ‘确认继续吗?’, ok: ‘确认’ } } …

【PAT甲级 - C++题解】1113 Integer Set Partition

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:PAT题解集合 📝原题地址:题目详情 - 1113 Integer Set Partition (pintia.cn) 🔑中文翻译:整数集合划分 &…

四、网络层(七)网络层设备

目录 7.1 路由器的组成和功能 7.2 路由表与路由转发 7.1 路由器的组成和功能 路由器是一种具有多个输入/输出端口的专用计算机,其任务是连接不同的网络(可以是异构的)并完成路由转发。在多个逻辑网络(即多个广播域&#xff…

高新技术企业认定的指标要求

高新技术企业认定的指标要求 1、拥有核心自主知识产权 (通过自主研发,受让等方式)拥有主营产品核心技术知识产权,数量要求:2项发明专利;10项实用新型专利软件著作版权。 2、产品(服务&#x…

深度学习训练营之海贼王人物识别

深度学习训练营之海贼王人物识别原文链接环境介绍前置工作设置GPU导入数据数据查看数据预处理加载数据可视化数据检查数据配置数据集prefetch()功能详细介绍:归一化查看归一化后的数据构建VGG-16网络网络结构编译模型训练结果可视化原文链接 🍨 本文为&a…

解决资源消耗,top的运用记录

第一条命令uptime load average 后面的三个数字,分别代表1分钟、5分钟和15分钟内机器的平均负载 使用top命令解决负载问题 Cpu(s)这一行提供了CPU运行情况信息 这些缩写分别代表了不同含义 (1)us:用户CPU时间 运行非优雅的用户进程所占CPU时间的百…

2-2-3-9-1-1、jdk1.7HashMap详解

目录数据结构链表的作用链表问题数据结构简图源码解析重要成员变量说明构造函数put操作初始化数组Key为null的处理计算hash添加链表节点--新增Entry扩容缺点扩容死锁分析单线程扩容多线程扩容数据结构 jdk1.7的hashmap的底层结构是数组加单向链表实现的。将key的hash值进行取模…

ubuntu20.04 22.04下设置用户只能使用sftp, 不能登录ssh 的配置方法

vi /etc/ssh/sshd_config Match Group sftp ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no 如果是列出单独用户的写法: Match user yonghu1 ChrootDirectory /home/yonghu1/ ForceCommand internal-sftp X11Forwarding no AllowTcpForwa…