new[]与delete[]

(要理解之前关于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[]

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值