2011-10-18 39 views
3

我需要从先前分配的内存块构造一个对象数组。然而,我不明白::operator new[]()::operator new()在分配该块时从用户的角度不同,因为两者都需要该块的大小。在下面的例子中,使用任何一个似乎都有相同的效果。我错过了什么吗?:: 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); 
    } 
} 
+0

[有什么单独的“operator new \ [\]”的目的?](http://stackoverflow.com/questions/2499895/whats-the-purpose-of-having-a-separate -operator-new) –

+0

我不认为它是一样的。那里的OP知道有什么不同,并问为什么。这里OP在询问有什么不同。对于精通C++的人来说,容易被弄糊涂,但这绝对不是同一个问题。 – littleadv

+0

@littleadv:就像我看到的那样(仍然在考虑你的评论之后),这绝对是完全一样的问题。 –

回答

3

您错用了new

使用new []的关键在于它调用了要分配的数组的每个元素的构造函数。 delete[]对于析构函数也是一样的。

您正在使用展示位置new并手动调用构造函数和析构函数,忽略了整个点。

+0

你能解释一下吗,因为我不了解你。我不想故意使用new和delete []。在:: operator new必须与构造一个对象数组分开调用的情况下,我没有看到两种方法之间的区别。 – Martin

+0

它看起来像OP知道的那样。但是,这个问题似乎与先前的问题完全相同。所以我投票结束。 –

+0

@Martin,如果你使用'new'作为'malloc'的替代品 - 没有区别。通常不应该使用“新”(虽然它允许在C++中使用)。 – littleadv

3

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

它们的不同在于,operator new是在非阵列抬头分配函数新表达(例如new J),而operator new[]是在阵列新表达抬头分配函数(例如new J[1])。如果一个程序有一个特定的策略来为数组分配内存,这与用于为单个对象分配内存的策略不同,这允许自定义。如果不需要这种定制,那么operator new[]可以仅委托给operator new(并且这实际上是由实现提供的分配功能所要求的,即::operator new::operator new[])。所以这种差异与您的代码无关。

+0

可能值得一提的是'new J [1]''通常会从分配函数中请求超过sizeof(J)* 1'个字节。 –

+0

@KerrekSB我不认为新的表达方式(除了通常的放置新方式)真的是这里的焦点。 –

相关问题