内容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开辟的整个完整空间,没报错,程序正常运行。

相关推荐
会编程的小孩8 小时前
C++ qt的安装
c++
小成2023032026514 小时前
C++~07补充
开发语言·c++
hold?fish:palm14 小时前
40 二叉树的直径
c++·leetcode
解决小子14 小时前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制
c++·笔记·游戏引擎·虚幻·gas·能力系统
lunar_coder16 小时前
【C++】如何解决智能指针的析构函数,如何实现shared_ptr的引用计数以及解决shared_ptr的循环引用
c++·1024程序员节
白白白小纯16 小时前
C++进阶.多态
c++
凯瑟琳.奥古斯特17 小时前
力扣1016高效解法:剪枝优化技巧
开发语言·c++·算法·leetcode·职场和发展
xiangyun6117 小时前
C++ priority_queue 底层:手撕二叉堆与 Top K 问题
c++·算法·面试·stl·1024程序员节
坤坤子吖18 小时前
C++继承:友元、静态成员、多继承与组合
开发语言·c++·笔记·学习·1024程序员节
qz_Serene18 小时前
练习算法题:双指针 -cpp
c++·算法·leetcode·1024程序员节