看一篇教程,看到有如下代码,给的打印结果是:
custom delete for size 1
custom delete for size 18
我感觉有点奇怪,在自己机器上跑了下,打印结果相同,重载了delete操作符,为何打印的结果是1和18呢?
我打印出来sizeof(P)结果是1,为何delete[] var2时显示的确是18不是10呢?
#include <bits/stdc++.h>
using namespace std;
struct P {
static void operator delete(void* ptr, std::size_t sz)
{
cout << "custom delete for size " << sz <<endl;
delete (ptr); // ::operator delete(ptr) can also be used
}
static void operator delete[](void* ptr, std::size_t sz)
{
cout << "custom delete for size " << sz <<endl;
delete (ptr); // ::operator delete(ptr) can also be used
}
};
int main()
{
P* var1 = new P;
delete var1;
P* var2 = new P[10];
delete[] var2;
}
应该是编译器在
new
分配数组内存的时候,前面多分配了一个整数大小的空间用来存储数组长度,不然delete []
操作不能确定数组大小。这个大小和机器有关,你应该是在64位机器上验证的,所以这个长度用64位存储,即8字节。struct没有成员,空间占用为0,但是编译器会给它分配1字节的空间(如果不分配空间的话,var2[0]和var2[1]的地址就是一样的了,这是标准不允许的)。结果就是8+10*1。当然,这个行为标准并没有定义,所以还是实现相关的,只不过大部分都是这样实现的。有意思的是,c++文档中也用的这个例子https://en.cppreference.com/w/cpp/memory/new/operator_delete
文档措辞比较严谨,可能的结果。所以不要依赖这个结果~