我无法解释为什么在示例代码中,对自定义 new Foo [4] 的调用 operator new[] 请求 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 ):



在实践中,它可以用来表示已分配元素的数量。正如 @vsoftco 评论的那样,“这就是运算符(operator) delete[] 知道如何执行清理的方式”。

请参阅 18.6.1.2 数组形式 中的脚注:

关于c++ - 自定义运算符 new[] 请求大于预期的内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33137115/

10-11 22:55
查看更多