考慮以下情況:取消分配指向對象的指針數組?
Class** array = new Class*[8];
array[1] = new Class(1,2);
只是做「delete[ ] array
」足夠的,或者我應該先於前者與「delete array[1]
」。我對內存管理並不完全熟悉。
考慮以下情況:取消分配指向對象的指針數組?
Class** array = new Class*[8];
array[1] = new Class(1,2);
只是做「delete[ ] array
」足夠的,或者我應該先於前者與「delete array[1]
」。我對內存管理並不完全熟悉。
每次調用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);
有道理。我在想,因爲只有對數組的引用可用於堆棧,所以刪除此引用應該足夠了,即delete []數組。 – Lakshmie 2010-11-13 03:56:34
考慮到第一個'new'創建一個包含8個指針的數組。如果系統自動刪除單個指針,它將如何知道它們中的哪些要刪除?你只設置了第二個條目('array [1]')指向另一個分配。數組中剩餘的7個條目未初始化。運行時如何知道它們中的7個不應該調用它們,而是應該調用它們? – jalf 2010-11-13 04:01:56
非常感謝jalf。我只需要記住它就像一個xml元素。每個開始標籤都應該有它的結束標籤。 :) – Lakshmie 2010-11-13 04:06:34
如果創建類類的對象vector
,並假設sizeof(Class)
超過4個字節,然後vector
是要進行復印,它會浪費內存。相反,考慮使用指針的向量類對象,這將始終創建4 * 8 = 32
字節的內存無關的sizeof(Class)
的。
如果你想在你的場景中釋放,請執行以下操作: for(i = 0 to 7){delete array [i];} delete array; – 2011-06-18 06:52:34
它是一個有效的代碼?我從來沒有以這種方式看到關鍵字「Class」的用法。 – prabhakaran 2010-11-13 04:21:48
@prabhakaran:'Class'不是關鍵字; 'class'是。名稱在C++中區分大小寫。 – 2010-11-13 05:33:42
(雖然在技術上'類'不是一個名稱,它是一個關鍵字... *嘆息*) – 2010-11-13 05:49:16