定义析构函数时为自定义类数组分配额外字节

ker*_*l22 8 c++ operator-overloading new-operator delete-operator

我正在尝试如下所示的代码:

class Example {
public:
    Example(int val = 0) : m_val(val) { }
    ~Example() { }

    void* operator new (std::size_t sz) { 
        std::cout << "Example created on the heap with size " << sz << std::endl;
        return std::malloc(sz);
    }

    void* operator new[] (std::size_t sz) { 
        std::cout << "Example created on the heap with size " << sz << std::endl;
        return std::malloc(sz);
    }

    void operator delete (void* ptr) noexcept {
        std::cout << "Deleted from the heap" << std::endl;
        std::free(ptr);
    }

    void operator delete[] (void* ptr) noexcept {
        std::cout << "Deleted from the heap" << std::endl;
        std::free(ptr);
    }
private:
    int m_val;
};
Run Code Online (Sandbox Code Playgroud)

从 main 中,我尝试new[]通过调用以下代码片段来测试运算符main

    Example* p_example = new Example[4];
Run Code Online (Sandbox Code Playgroud)

预期的输出是 16,即 4 倍sizeof(int)(因为该类只有一个 4 字节m_val成员变量)。然而终端上的输出是:

Example created on the heap with size 24
Run Code Online (Sandbox Code Playgroud)

现在,当我注释掉该类的析构函数时,输出就是人们所期望的。因此带有注释的析构函数的输出是:

Example created on the heap with size 16
Run Code Online (Sandbox Code Playgroud)

vtable我通过添加虚拟函数消除了为指针分配额外 8 个字节的可能性。在这种情况下,分配的总内存比原始内存(24 字节)多了 8 字节,因此额外分配的 8 字节内存仍在分配,所以我相信这不是由于遗产。

我无法弄清楚在这个特定示例中额外的 8 个字节分配在哪里,因此任何有关相同的提示将不胜感激。我尝试使用 gdb 进行调试并查看某处是否存在任何额外变量,但我没有注意到任何异常情况。谢谢!