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