测试是否在数组周围存放数组大小
运行结果:
可见,在数组周围并没有记录数组的大小。
使用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 []并不需要知道数组有多少个元素,也不用管数组大小,整体的大小由操作系统来处理。
以上为个人理解,如有错误,恳请指正。