(要理解之前关于new,delete的一些概念,看
CSDN)
引子:
相比new,new[]不仅仅是个数的增加,还有int大小记录空间的创建,
下图中错误的用模拟多个new来替代new[],释放步骤一样。
为什么按照new的逻辑写,并且正常全部析构会析构那么多次?
一,operator new[]
new的底层是operator new与构造函数,operator new的底层是malloc与异常识别
delete的底层是析构函数与operator delete,operator delete的底层是free与异常识别
operator new[]的底层是operator new[]与所有对象的构造,operator new[] 的底层是operator new,和数组个数记录空间创建操作
operator delete[]的底层是所有对象的析构与operator delete[],operator delete[]底层是operator delete和指针记录空间的跳转和后移操作
---------------------------------------------------------------------------------------------------------------------------------
operator new[ ]实质做的:(加上构造为new[ ]做的)
delete[ ]实质做的:
---------------------------------------------------------------------------------------------------------------------------------
对引子的解答:
new只比malloc多了个异常检测,不会额外开辟空间告诉delete[]要析构的次数,(其目的本也就是定义构造单个对象),所以,再调delete[],依然会向前int大小空间找析构次数,这没初始化的空间当然是随机值,可能很大可能很小,谁知道delete[]会析构多少次。
总结:new,delete最好对单个对象使用。
new[],delete[]对多对象使用,防止莫名奇妙的bug。(new[],delete[]该凑一对儿)
---------------------------------------------------------------------------------------------------------------------------------
malloc,free,new,delete,new[],delete[]可以混用的总结:(最好不要)
(内置类型和自定义类型中只有内置类型)且不需初始化:malloc,free,new,delete,new[]这几个可以混用,但不能使用异常检测,可能new[]会浪费空间。(要搞单个还是数组从中选)
自定义类型无要释放的资源要初始化(可参考我的另一篇):new,delete,new[]。
--->这些只是没有问题,但写这样代码很丢人,别用。
建议:
单个:new,delete
多个:new[],delete[]