c++ - 运算符 new[] 不接收额外的字节

标签 c++ operator-overloading new-operator destructor

我有这样的代码

#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;
}

在这种情况下,我在 operator new 重载中收到了我想要的 20 个字节的 size 值 (sizeof(int) * 5)。但是如果我取消对析构函数的注释,我得到的 size 为 24 字节。是的,我现在这些额外的字节用于存储分配内存的大小,等于 sizeof(size_t)。我不明白为什么我只有在明确实现析构函数时才得到它们。如果我不这样做,编译器应该做完全相同的事情,否则我遗漏了什么?

我已经在 MSVS 2010 和 2012 上试过了。为 Win32 编译。

最佳答案

new[]operator new[] 请求的“额外字节”并不像您所相信的那样用于“存储已分配内存的大小”。它们用于存储数组中的元素数,以便delete[] 知道要调用多少析构函数。在您的示例中,析构函数是微不足道的。没有必要调用他们。因此,无需分配这些额外的字节并存储元素计数。

“分配内存的大小”(即 block 的大小以字节为单位)是一个完全不同的故事。它由较低级别的分配器(示例中的 malloc/free)独立存储和检索。

换句话说,在一般情况下,由 new[] 分配的内存块在实际数据前面有两组额外字节:以字节为单位的 block 大小(由 malloc 引入) 和元素计数(由 new[] 引入)。第二个是可选的,如您的示例所示。第一个通常始终存在,因为它由 malloc 无条件分配。 IE。即使您只请求 20,您的 malloc 调用也会实际分配超过 20 字节。 malloc 将使用这些额外字节以字节为单位存储 block 大小。

后者也发生在您的示例中。您根本看不到它,因为它发生在 malloc 中。

关于c++ - 运算符 new[] 不接收额外的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13746517/

相关文章:

c++ - 使用 poll() 的 C++ 服务器没有响应

c++ - 如何将 long 转换为 LPCWSTR?

c++ - 覆盖原始数据类型的转换

c++ - 如何在 C++ 中为数组重载运算符<<?

python - 开始 MySQL/Python

构造函数中的 C++ 单例

.net - 如何向我的 C++ 项目添加计时器?

c++ - 运算符 double() 的使用不清楚

c++ - new 运算符如何知道需要为特定类分配多少大小

C++ new <datatype>(<value>) 到底做什么?