5
struct A final
{
    int a;

    void* operator new(size_t size)
    {
        //
        // Is size always equal to sizeof(A) here?
        //
        return ::operator new(size); 
    }

    void operator delete(void* ptr)
    {
        ::operator delete(ptr);
    }
};

int main()
{
    for (auto i = 0; i < 100; i++)
    {
        delete new A;
    }
}

我的问题也嵌入在代码中。

C++ 标准是否保证传递给 A::operator new() 的大小总是相同的?

更新: 在这里,只考虑 A 只是一个最终类。

4

2 回答 2

4

引用 C++11 标准,第 5.3.4 节第 10 点:

new 表达式将请求的空间量作为 std::size_t 类型的第一个参数传递给分配函数。该参数不应小于正在创建的对象的大小;只有当对象是一个数组时,它才可能大于正在创建的对象的大小。

所以,是的,它保证与对象的大小相同。但是请注意,不同的编译器或不同的编译器选项可能会在编译时改变特定对象的实际大小。

于 2013-08-27T08:26:08.907 回答
4

不。

尝试:

struct B: public A
{
    double a;
}

现在,当您创建 B 时,新运算符将获得不同的大小

int main()
{
    for (auto i = 0; i < 100; i++)
    {
        delete new A;
        delete new B;
    }
}

PS加个打印看看:

void* operator new(size_t size)
{
    std::cout << "S(" << size << ")\n";
    //
    // Is size always equal to sizeof(A) here?
    //
    return ::operator new(size); 
}

输出:

> ./a.out
S(4)
S(12)
S(4)
S(12)
S(4)
于 2013-08-27T03:58:13.137 回答