自定义运算符new[]请求大于预期的内存

Custom operator new[] requests for larger than expected memory

本文关键字:内存 大于 请求 运算符 new 自定义      更新时间:2023-10-16

我无法解释为什么在示例代码中,对自定义operator new[]的调用new Foo [4]请求68字节—比它应该(sizeof(Foo) == 16)多4字节,而更神秘的调用Foo::operator new[]( 4 * sizeof( Foo ) )正确地请求64字节。注意,当成员std::vector<long> m_dummyFoo中移除时,两个调用都正确地请求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):

new T[5]导致调用operator new[](sizeof(T)*5+x)

这里,x…是非负的未指定值,表示数组分配开销;的结果是new-expression将从操作符new[] . ...

返回的值中偏移这个量。

每次调用new的开销可能会有所不同。

在实际操作中,

可用于表示已分配元素的数目。正如@vsoftco注释的那样,"这就是操作符delete[]知道如何执行清理的方式"。

参见18.6.1.2数组形式:

operator new[](std::size_t)operator delete[](void*)不直接负责记录数组的重复计数或元素大小。这些操作在数组newdelete表达式的其他地方执行。然而,数组new表达式可以将size参数增加到operator new[](std::size_t),以获得存储补充信息的空间。