2011-10-18 40 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我不認爲新的表達方式(除了通常的放置新方式)真的是這裏的焦點。 –

相關問題