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

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

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; 
} 
阅读 1.9k
1 个回答

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

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

推荐问题