2012-10-24 71 views
-2

所以我們下面的代碼,這說明了一個「指針陣列」(我認爲)別的東西數組和

main() { 
    int *array[3]; 
    int x = 10, y = 20, z = 30; 

    array[0] = &x; 
    array[1] = &y; 
    array[2] = &z; 

    return 0; 
} 

現在,讓我們說的不是int S,他們是一個類型的您創建的對象類。

所以我想從這個數組中刪除成員(即通過刪除關鍵字的方式來調用它的析構函數,並已物體破壞,但具有指針仍然很好。)

如果我的懷疑是正確的,這是不可能的,我唯一的選擇是將數組的內容複製到一個新的數組(除了我想刪除的數組之外),然後刪除前一個數組(作爲一個整體與所有它的元素),而我分配新的指針array

我將不勝感激,如果有人可以證實或糾正我的懷疑,特別是因爲名稱「指針數組」是SO誤導。謝謝。

+0

這樣做,你不應該需要'刪除',它會是UB嘗試。 – chris

+0

不,刪除主「數組」只會刪除數組,指針會保持不變。這實際上是在大多數情況下導致內存泄漏的人,他們忘記了用指針數組來遍歷並刪除每個元素中的內存。 (除非你使用「delete []數組」,這也會刪除內容) – u8sand

+0

你想要做什麼'std :: vector'和'std :: vector :: erase'將不起作用? – chris

回答

2

假設你有一個類Foo

Foo a; 

這是的Foo對象的一個實例。它分配在堆棧。當超出範圍時,將會被銷燬,最遲

如果您希望能夠明確銷燬您的對象,請將其分配到

Foo* a = new Foo(); // Allocated - Constructor called. 
delete a; // Freed - Destructor called. 

一個好的規則要記住的是,每一個new應該有一個匹配delete,不多也不少。在您的示例中,您尚未使用關鍵字new,因此沒有關於delete關鍵字的位置。

Foo* array[3]; 

是一個陣列,所述堆,的Foo對象指針。他們沒有指向任何東西,它們未被初始化。這個數組在超出範圍時將被銷燬。請記住,只有銷燬內容,它們是指針,並且不會嘗試釋放它們指向的任何內容。

array[0] = new Foo(); 

該數組現在持有一個指向堆上的Foo對象的指針。它還包含2個未初始化的指針。如果你讓array超出範圍,你將是泄漏內存。爲了防止這種情況,您必須釋放您的Foo對象。

delete array[0]; 
array[0] = NULL; 

將未初始化的或已刪除的指針設置爲NULL也是一種很好的做法。這樣你可以明確地看到它沒有指向任何東西。你現在可以執行這樣的檢查:

if(array[0]) 
{ 
    // We know there is an object here, since it's not NULL. 
    delete array[0]; 
    array[0] = NULL; // Helps prevent trying to free memory more than once. 
} 
+0

非常感謝。這當然清理了很多。很多。 – Yokhen

+0

太棒了!看起來你的評論部分變得有些瘋狂。很高興我能幫上忙。 – Aesthete

0

據我理解您的問題,它不會,原因有二:

  1. 你將不能夠在所有要刪除這些元素(INT的或A的),因爲它們駐留在堆棧上,不在堆中,它們將在超出範圍時自動刪除;
  2. 刪除或移動數組不會刪除它的元素,因爲它已經在上面說過了。

    array[1] = NULL; 
    

    如果我理解正確:

至於 「消去數組的內容[1]」,可以通過進行。

+0

因此,如果元素駐留在堆棧中,如果我總是添加和刪除新項目,我將如何避免堆棧溢出? – Yokhen