如果包含析构函数,则类的大小会增加

Size of a class increases if destructor is included

本文关键字:增加 包含 析构函数 如果      更新时间:2023-10-16
class MyClass {
        int data;
        public:
        MyClass() : data(0) { /*cout << "Ctor" << endl;*/}
        void* operator new(size_t sz) { cout << "Size in new: " << sz << endl; void* s = malloc(sz); return s; }
        void* operator new[] (size_t sz) { cout << "Size: " << sz << endl; void* s = malloc(sz); return s; }
        void operator delete(void* p) { free(p); }
        void operator delete[](void* p) { free(p); }
        ~MyClass() {}
};
int main() {
        // your code goes here
        MyClass* p = new MyClass[1];
        delete[] p;
        cout << "Size of class: " << sizeof(MyClass) << endl;  
        return 0;
}

我重载了new和delete操作符。我在这里观察到的奇怪行为是,如果我包含传递给new操作符的析构函数的大小增加了4,而MyClass的大小仍然是4,这是显而易见的。

我得到的输出是带有析构函数的:
尺寸:8
class Size: 4

我得到的输出没有析构函数:
尺寸:4
class Size: 4

为什么包含析构函数会增加大小?

思考delete[]的工作原理。如果没有析构函数,很可能它所需要做的就是将地址传递给free。但是如果有析构函数,它必须知道数组中有多少个元素,这样它就知道调用析构函数的次数。所以需要一些额外的空间来容纳数组的大小。