这一块知识只是了解就行,但没听太懂
- 左值:有名字、能放在赋值号左边、能取地址比如:普通变量
a、对象aa - 右值:没名字、临时的、用完就扔比如:字面量
10、A()匿名临时对象、表达式结果
不同区不同生命周期,不同生命周期不同需求
以上程序会因为申请内存过大而失败,假设不管,就会抱错。这里如下图显示有异常,必须捕获,不然终止报错
尝试捕获,exception是库中异常的类型,这里先写就行
当运行到某处申请失败时就会直接跳转到catch,再继续走
再次运行如下,显示申请内存失败
虚拟内存
了解new底层大概做什么操作
new相当于是加强版malloc
delete相当于是加强版malloc
}
以下代码在以上前提下使用
1.
2. A B类中都无资源申请,前者有析构函数,后者无。
p2p3都是80字节
p2运行成功 p3运行失败为什么?如下
new创建一个对象时,返回一个指向该对象的地址。
使用delete时,直接从new开辟空间后返回的指针处开始析构一个对象,然后free一个对象。
当用new创建多个自定义类型时,会额外开辟4字节用来存放对象个数(为了后面使用delete[]时,让编译器知道要析构几个对象),返回一个指向首个对象的地址(不是开辟空间的开端,而是中端)。
用delete[]释放时,会将返回的指针自动向前移动4字节进行释放,读取到要析构几个对象,然后再进行free释放。
注意free时只能 从开辟的完整空间 的开头处开始释放空间,否则报错
由上所述p3只能用delete[],用delete析构第一个对象后,报错
p2由于类内没有析构函数,编译器会进行优化行为(认为它没有申请资源,不会调用析构函数,所以new创建时也就不需要额外开辟4字节用来存放对象个数),此时返回的是开辟的完整空间的开头处,使用delete,不会调用析构函数,直接free new开辟的整个完整空间,没报错,程序正常运行。若p2类内有析构函数,也会如p3一样。
一定要匹配使用
new的底层就是调opertor new 和构造函数,为什么用opertor new,就是为了解决直接使用malloc会报异常的问题