浅谈delete[]如何处理数组

测试是否在数组周围存放数组大小在这里插入图片描述
运行结果:
在这里插入图片描述
可见,在数组周围并没有记录数组的大小。

使用delete释放数组和释放单个元素空间应该是没有区别的。
如delete[] arr, delete e;

释放单个元素不用解释,那么释放数组空间时是否需要获取其元素个数呢?
个人认为,这是不需要的。

大家都知道,在new一个对象时,执行的两个操作,operator new申请内存,然后进行构造;
delete时,先析构,然后operator delete释放。这里我们只讨论申请和释放内存的过程。
主要是operator new[], operator delete[], 这两个与数组有关的内存操作。

operator new的源码如下:
在这里插入图片描述
实际只是根据sz参数执行了一个malloc操作,sz即size(要申请的内存的大小)。

operator new[]:
在这里插入图片描述
也是使用了sz参数,调用了operator new

我们来看一下operator new的参数值的意义。

重载运算符即可查看。
在这里插入图片描述
结果:
在这里插入图片描述
从运行结果可以知道,operator new[]的参数即为要申请的总大小(然后就是malloc(40)),

那么释放数组时呢?
在这里插入图片描述
也仅是使用了指针,跟数组大小无关。

那么怎么知道这个指针对应的内存大小呢? – 由操作系统来维护。

操作系统维护一些内存块区域:比如10B,20B,30B的内存区域。
当malloc(40)时,操作系统在40B的内存区里分配 一块内存,
在释放时,查看指针位置是在40B区域里,那么就是释放40B。

当然,不同的编译器有不同的实现,不同的操作系统对内存管理也有不同的实现。

所以本文的结论是,delete []并不需要知道数组有多少个元素,也不用管数组大小,整体的大小由操作系统来处理。

以上为个人理解,如有错误,恳请指正。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值