我无法解释为什么在示例代码中,对自定义 new Foo [4]
的调用 operator new[]
请求 68 个字节——比它应该( sizeof(Foo) == 16
)多 4 个字节,而更神秘的调用 Foo::operator new[]( 4 * sizeof( Foo ) )
正确请求 64 个字节。请注意,当成员 std::vector<long> m_dummy
从 Foo
中删除时,两个调用都会正确请求 16 个字节(ideone 上的代码)。
#include <vector>
#include <iostream>
struct MemoryManager
{
static void* allocate( unsigned size )
{
static char block[256];
return block;
}
};
class Foo
{
public:
void* operator new[]( size_t size )
{
std::cout << "operator new[] : data size -- " << size << std::endl;
return MemoryManager::allocate( size );
}
private:
std::vector<long> m_dummy; // Huh?
unsigned m_num;
};
int main( int argc, char * argv[] )
{
std::cout << "Foo size: " << sizeof( Foo ) << std::endl;
new Foo [4];
Foo::operator new[]( 4 * sizeof( Foo ) );
}
最佳答案
根据标准( 5.3.4 New ):
在实践中,它可以用来表示已分配元素的数量。正如 @vsoftco 评论的那样,“这就是运算符(operator) delete[]
知道如何执行清理的方式”。
请参阅 18.6.1.2 数组形式 中的脚注:
关于c++ - 自定义运算符 new[] 请求大于预期的内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33137115/