new和delete[]的隐藏属性(new+delete补充)

new和delete[]的隐藏属性(new+delete补充)

 

我们在一次测试中突然发现,用new开辟的内置类型空间数组,我们知道是需要delete[]来进行释放的,但是突然发现不加[],光delete也可以将其释放,不会造成内存泄漏:

 

查找资料后发现,是因为new开辟内置类型空间的时候会将其开辟的大小信息也存储下来,在delete的时候进行释放,而不会造成内存泄漏。

 

这不是我们今天的重点,重点是在new开辟对象数组,delete的时候没有加[],那么会自动将其它对象空间释放掉吗?

如果是,那么就很恐怖了,因为我们知道开辟的内置类型变量只是一个内存块,而开辟的对象是内存+资源的存在,如果delete直接将其他对象的内存也直接释放掉,那么对象的析构函数只会调用触发一次,其他的对象的额外资源得不到正常释放。

我们可以看看测试结果:

 

我们可以看到,类Test的构造函数调用了10次,而析构函数只会调用一次。

 

那么我们应该思考一下,为什么delete会将其他对象的内存也释放掉,难道它也知道开辟的对象个数吗?

或者这样问:int *p = new Test[10]; 这个Test对象空间是开辟了10个还是11个?

我们经过测试发现,是会多开辟一个对象内存空间在最头部,也就是[-1]的位置。

这个对象内存空间存储了其开辟的对象个数,这个数值保存在对象最小的数据类型变量上(指针除外)。

例如如下类Test最小的成员变量类型是char:

 

所以不可避免的会存在数值溢出的问题,比如char类型的范围是【-128,+127】,那么开辟128个对象的时候,这个char类型必将会存储不下来:

 

所以我们会发现,我们会发现[]是真的不能丢,很容易出现内存释放不完全的状况。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值