内容7 内存管理 1

、

上图中new A(1)不是创建一个匿名对象,而是按照类创建了一个对象

以上程序会因为申请内存过大而失败,假设不管,就会抱错。这里如下图显示有异常,必须捕获,不然终止报错

尝试捕获,exception是库中异常的类型,这里先写就行

当运行到某处申请失败时就会直接跳转到catch,再继续走

再次运行如下,显示申请内存失败


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



new创建一个对象时,返回一个指向该对象的地址。

使用delete时,直接从new开辟空间后返回的指针处开始析构一个对象,然后free一个对象。

当用new创建多个自定义类型时,会额外开辟4字节用来存放对象个数(为了后面使用delete\[\]时,让编译器知道要析构几个对象),返回一个指向首个对象的地址(不是开辟空间的开端,而是中端)。

用delete\[\]释放时,会将返回的指针自动向前移动4字节进行释放,读取到要析构几个对象,然后再进行free释放。

注意free时只能 从开辟的完整空间 的开头处开始释放空间,否则报错

类内没有析构函数,编译器会进行优化行为(认为它没有申请资源,不会调用析构函数,所以new创建多个对象时也就不需要额外开辟4字节用来存放对象个数),此时返回的是开辟的完整空间的开头处,使用delete,不会调用析构函数,直接free new开辟的整个完整空间,没报错,程序正常运行。

相关推荐
(Charon)1 分钟前
【C++面试】vector底层原理:扩容、拷贝移动与迭代器失效
c++·面试
朔北之忘 Clancy16 分钟前
青少年软编等考七级题解目录
开发语言·c++·青少年编程·gesp·csp·信奥赛·noi
汉克老师33 分钟前
GESP2026年9月认证C++七级( 第一部分选择题(8~15题)精讲
c++·gesp·小学生·学c++编程
Mr_Macallon36 分钟前
C++回顾(基础)(01)
c语言·开发语言·c++·学习
如意猴1 小时前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法
朝朝辞暮i1 小时前
C++ 第 32 课:main()、rclcpp::init()、spin()、shutdown()
开发语言·c++·算法
汉克老师1 小时前
GESP2026年9月认证C++一级( 第三部分编程题(1、新龟兔赛跑))精讲
c++·gesp·小学生·学c++编程
沫璃染墨2 小时前
《从零入门Linux系统篇(五十七):线程篇·十——生产者消费者模型进阶:从环形缓冲区到POSIX信号量》
linux·运维·服务器·开发语言·c++·系统架构·信号处理
wuminyu2 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
知识分享小能手2 小时前
C++ 学习教程,从入门到精通,string类和标准模板库 — 完整知识点详解(16)
开发语言·c++·学习