内容7 内存管理 1

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

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

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

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

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


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



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

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

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

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

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

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

相关推荐
无小道3 分钟前
C++——列表初始化
c++·列表初始化
blueSatchel18 分钟前
c++action 编写(ros-humble)
c++·ros2
老赵的博客2 小时前
c++面试之从虚函数表到Rtti一次性讲清楚
c++·qt
傲世仙尊3 小时前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
cvby3 小时前
C++11
开发语言·c++
6Hzlia4 小时前
【Classic 150 刷题计划】 LeetCode 26. 删除有序数组中的重复项 | C++ 快慢双指针经典模板
c++·算法·leetcode
夜不会漫长4 小时前
C++:类和对象(2)
java·javascript·c++
无小道5 小时前
C++ 中 `explicit` 关键字详解:彻底理解隐式类型转换
c++·explicit
蒸蒸yyyyzwd5 小时前
cpp 选手秋招学习笔记 day34
c++·八股
Tairitsu_H5 小时前
[C++] C++11类和STL的新特性
开发语言·c++·stl·c++11