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

相关推荐
星轨初途17 分钟前
LeetCode 热题 100——day2 字母异位词分组
c++·算法·leetcode
笨鸟先飞的橘猫1 小时前
c++面向对象编程
开发语言·c++
啦啦啦啦啦zzzz1 小时前
设计模式:桥接模式和组合模式
c++·设计模式·组合模式·桥接模式
-森屿安年-1 小时前
647. 回文子串
c++·算法·动态规划
fpcc2 小时前
c++应用网络编程之十七WebSocket
网络·c++·websocket
haolin123.2 小时前
类和对象(下)
c语言·开发语言·c++
皓月斯语2 小时前
P5736 【深基7.例2】质数筛
c++·算法·题解
鸿芯微控科技2 小时前
MFC质量流量控制器流量不准怎么排查?设定值、反馈值与参考流量对比,附Python代码
c++·python·mfc
拂拉氏2 小时前
【知识讲解】 让指针拥有“自我意识”?--C++智能指针相关内容讲解
c++·智能指针
CVer儿3 小时前
c++二级指针
开发语言·c++