::operator new[]()与::operator new()有什么不同?

In what way is ::operator new[]() different than ::operator new()?

本文关键字:operator new 什么      更新时间:2023-10-16

我需要从先前分配的内存块中构造一个对象数组。然而,在分配该块时,从用户的角度来看,我无法理解::operator new[]()::operator new()的不同之处,因为两者都需要块的大小。在下面的示例中,使用其中任何一个似乎都有相同的效果。我错过什么了吗?

class J {
};
int main() {
    const int size = 5;
    {
        J* a = static_cast<J*> (::operator new[](sizeof (J) * size));
        for (int i = 0; i < size; i++)
            new (&a[i]) J();
        for (int i = 0; i < size; i++)
            a[i].~J();
        ::operator delete[] (a);
    }
    {
        J* a = static_cast<J*> (::operator new(sizeof (J) * size));
        for (int i = 0; i < size; i++)
            new (&a[i]) J();
        for (int i = 0; i < size; i++)
            a[i].~J();
        ::operator delete (a);
    }
}

你在滥用new

使用new []的要点在于它为分配的数组的每个元素调用构造函数。delete[]对析构函数做同样的操作。

您正在使用位置new并手动调用构造函数和析构函数,错过了整个要点。

它们都是分配函数,因此它们都被要求返回适合请求大小的存储空间(这里是sizeof(J) * size)。这就是为什么它们在你的代码中没有什么不同。

它们的不同之处在于operator new是在非数组new表达式中查找的分配函数(例如new J),而operator new[]是在数组new表达式中查找的分配函数(例如new J[1])。如果程序为数组分配内存的策略不同于为单个对象分配内存的策略,则允许自定义。如果不需要这样的定制,那么operator new[]可以直接委托给operator new(这实际上是实现提供的分配函数所强制要求的,即::operator new::operator new[])。所以这个差别与你的代码无关