1.new/delete
上面是基本语法。
用new开辟自定义类型,十分方便。
new还有一个优势:new失败了以后会抛异常,不需要手动检查。
2.new与delete的底层
由operator new这一层抛异常。
delete一个自定义类型时,先调用析构函数,在调用operator delete。
3.new/delete提高
首先ptr1有4个字节,但ptr2有44个字节。多出来的四个字节存开的自定义类型的个数,让delete []知道需要调用几次析构函数,前提是用户显式写了析构函数。如果用户没有写析构函数,编译器会进行优化,将那4个字节省掉,ptr2只有40个字节了!
所以,p1有40个字节而不是44个,因为无析构函数可调。
new delete/new[] delete []/malloc free要匹配使用,如果不匹配就会出问题。
这里delete p1不会出现问题,delete p2程序会崩溃。
delete p2有两个致命的错误:(如果没有手动定义析构函数则不会报错)
1.没有正确调用析构函数,可能会内存泄漏。
2.内存释放的位置错了,动态开辟的内存不能从中间释放,应该向前偏移4个字节再释放。
总之一定要匹配使用,否则结果不确定。因为如果编译器不优化,没有定义析构函数也可能报错。
4.定位new
注意析构函数是可以直接调用的,但构造函数不可以,需要调用定位new。
定位new的作用:如果有一个空间需要显式调用构造函数,就用定位new。
5.new/delete与malloc/free的区别
c++几乎不需要扩容的函数。有了new之后,几乎放弃了malloc这个系列。