c++重载delete,打印大小疑问

看一篇教程,看到有如下代码,给的打印结果是:

custom delete for size 1
custom delete for size 18
我感觉有点奇怪,在自己机器上跑了下,打印结果相同,重载了delete操作符,为何打印的结果是1和18呢?

我打印出来sizeof(P)结果是1,为何delete[] var2时显示的确是18不是10呢?

#include  
using namespace std; 

struct P { 
    static void operator delete(void* ptr, std::size_t sz) 
    { 
        cout << "custom delete for size " << sz <

最佳答案

应该是编译器在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

image.png

文档措辞比较严谨,可能的结果。所以不要依赖这个结果~