【发布时间】:2012-11-24 15:40:45
【问题描述】:
我有这样的代码
#include <cstdlib>
class Foo
{
int m_data;
public :
Foo() : m_data(0) { }
/*~Foo()
{
}*/
static void* operator new[](const size_t size)
{
return malloc(size);
}
static void operator delete[](void* data)
{
free(data);
}
};
int main()
{
Foo* objects = new Foo[5];
delete [] objects;
}
在这种情况下,我在 operator new 重载中收到 size 的值作为我想要的 20 个字节 (sizeof(int) * 5)。但是,如果我取消注释析构函数,我会得到 size 为 24 个字节。是的,我现在这些额外的字节用于存储分配内存的大小,等于sizeof(size_t)。我不明白为什么只有当我明确地实现析构函数时才能得到它们。如果我不这样做,编译器应该做完全相同的事情还是我错过了什么?
我已经在 MSVS 2010 和 2012 上尝试过。为 Win32 编译。
【问题讨论】:
-
为什么你认为编译器“应该做同样的事情”?
-
我认为如果我根本不实现析构函数,编译器会为我生成它,它看起来就像我在上面的示例中评论过的那样 - 为空。
-
从概念上讲,情况就是这样。但是,当编译器隐式实现一个完全不做任何事情的析构函数时,这种析构函数称为trivial。这样的析构函数实际上并没有起到任何作用,编译器也不必调用它。实际上,即使你显式实现了一个空的析构函数,编译器也不必调用它,但你的编译器显然想保留调用。
-
感谢您的回答。我真的不知道
标签: c++ operator-overloading new-operator destructor