我有这样的代码
#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
.但是,如果我取消注释析构函数,我会得到size
24字节.是的,我现在用这些额外的字节来存储已分配内存的大小并等于sizeof(size_t)
.我无法理解为什么只有在我明确地实现析构函数时才能得到它们.如果我不这样做,编译器应该做同样的事情或者我错过了什么?
我在MSVS 2010和2012上试过了.编译为Win32.
我发现operator new []存在问题:
#include <stdlib.h>
#include <stdio.h>
class V4 { public:
float v[ 4 ];
V4() {}
void *operator new( size_t sz ) { return aligned_alloc( 16, sz ); }
void *operator new[]( size_t sz ) { printf( "sz: %zu\n", sz ); return aligned_alloc( 16, sz ); }
void operator delete( void *p, size_t sz ) { free( p ); }
//void operator delete[]( void *p, size_t sz ) { free( p ); }
};
class W4 { public:
float …
Run Code Online (Sandbox Code Playgroud)