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

标签 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
类(class)规模:4人

我得到的输出没有析构函数:
尺寸:4
类(class)规模:4人

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

最佳答案

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

关于c++ - 如果包含析构函数,类的大小会增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31402274/

相关文章:

C++ 字符串追加函数奇怪的行为

c++ - 重载级联插入运算符

java - Java 中的解构函数?

c++ - 无法将枚举值传递给递归模板 (C++)

c++ - 我如何知道 Boost 的哪些部分已被弃用?

c++ - 我应该从以下功能中选择什么

c++ - C++ 中的析构函数和类 [内存泄漏]

c++ - 销毁并重新生成赋值运算符 : what if I'm careful?

c++ - 不同类型的模板函数

c++ - 重载运算符,这个例子中重载运算符的目的是什么