Pav*_*sky 7 c++ destructor operator-overloading new-operator
我有这样的代码
#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;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我接收size运算符新重载的值为20个字节,如我想要的那样sizeof(int) * 5.但是,如果我取消注释析构函数,我会得到size24字节.是的,我现在用这些额外的字节来存储已分配内存的大小并等于sizeof(size_t).我无法理解为什么只有在我明确地实现析构函数时才能得到它们.如果我不这样做,编译器应该做同样的事情或者我错过了什么?
我在MSVS 2010和2012上试过了.编译为Win32.
正如您所相信的那样,new[]来自"请求"的"额外字节" operator new[]不会用于"存储已分配内存的大小".它们用于存储数组中元素的数量,以便delete[]知道要调用多少个析构函数.在你的例子中,析构函数是微不足道的.没有必要打电话给他们.因此,不需要分配这些额外的字节并存储元素数.
"分配的内存大小"(即块的大小,以字节为单位)是一个完全不同的故事.它由较低级别的分配器独立存储和检索 - malloc/free在您的示例中.
换句话说,通常情况下,分配的存储块new[]在实际数据前面有两组额外字节:块大小(以字节为单位)(由介绍malloc)和元素计数(由其引入new[]).第二个是可选的,正如您的示例所示.第一个通常始终存在,因为它是无条件分配的malloc.即使您只是请求,您的malloc呼叫将物理分配超过20字节20.这些额外的字节将用于malloc存储块大小(以字节为单位).
后者也发生在你的例子中.你根本没有看到它,因为它发生在里面malloc.