2010-11-13 94 views
0

考慮以下情況:取消分配指向對象的指針數組?

Class** array = new Class*[8]; 
array[1] = new Class(1,2); 

只是做「delete[ ] array」足夠的,或者我應該先於前者與「delete array[1]」。我對內存管理並不完全熟悉。

+0

它是一個有效的代碼?我從來沒有以這種方式看到關鍵字「Class」的用法。 – prabhakaran 2010-11-13 04:21:48

+0

@prabhakaran:'Class'不是關鍵字; 'class'是。名稱在C++中區分大小寫。 – 2010-11-13 05:33:42

+0

(雖然在技術上'類'不是一個名稱,它是一個關鍵字... *嘆息*) – 2010-11-13 05:49:16

回答

5

每次調用new[]的時候,你必須調用delete[]上的指針解除分配。每次撥打new時,您都需要致電delete

在你的情況,你叫new兩次。 array[1]包含一個指向與new分配的一類,所以它必須與delete被釋放。和array是指向與new[]分配一個數組,所以它必須與delete[]被釋放。

當然,你可能會通過簡單的聲明數組保存自己這個頭痛的是這樣的:

Class array[8]; 
array[1] = Class(1,2); 

沒有動態內存分配意味着不需要調用delete

或者使用std::vector

std::vector<Class> array(8); 
array[1] = Class(1,2); 
+0

有道理。我在想,因爲只有對數組的引用可用於堆棧,所以刪除此引用應該足夠了,即delete []數組。 – Lakshmie 2010-11-13 03:56:34

+2

考慮到第一個'new'創建一個包含8個指針的數組。如果系統自動刪除單個指針,它將如何知道它們中的哪些要刪除?你只設置了第二個條目('array [1]')指向另一個分配。數組中剩餘的7個條目未初始化。運行時如何知道它們中的7個不應該調用它們,而是應該調用它們? – jalf 2010-11-13 04:01:56

+0

非常感謝jalf。我只需要記住它就像一個xml元素。每個開始標籤都應該有它的結束標籤。 :) – Lakshmie 2010-11-13 04:06:34

0

如果創建類的對象vector,並假設sizeof(Class)超過4個字節,然後vector是要進行復印,它會浪費內存。相反,考慮使用指針的向量類對象,這將始終創建4 * 8 = 32字節的內存無關的sizeof(Class)的。

+0

如果你想在你的場景中釋放,請執行以下操作: for(i = 0 to 7){delete array [i];} delete array; – 2011-06-18 06:52:34