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

时间:2015-07-14 09:04:06

标签: c++ operator-overloading destructor new-operator sizeof

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
班级规模:4

我得到的输出没有析构函数:
尺寸:4
班级规模:4

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

1 个答案:

答案 0 :(得分:5)

考虑delete[]的工作原理。如果没有析构函数,则很可能只需要将地址传递给free。但是如果有一个析构函数,它必须知道数组中有多少元素,因此它知道调用析构函数的次数。因此需要一些额外的空间来保持数组的大小。