2011-11-27 75 views
1

我想知道是否有辦法刪除指針數組而不觸及內存中的指向對象。刪除指針數組而不刪除內存中的指向對象?

我正在爲幾天前實現的HashSet寫一個約束例程,所以當哈希表已滿時,它將被另一個雙倍大小的表所取代。我使用指向一個對象的指針數組(User)來表示哈希表,並且該數組本身在我的HashSet類中動態聲明,因此可以在使用哈希函數將其所有內容複製到新表後將其刪除。

所以基本上我需要:

  1. 聲明另一個表,其大小等於原始陣列大小的兩倍。
  2. 將每個指向User對象的指針從我的原始數組複製到應用我的散列函數的新對象(它從內存中獲取User對象,並使用表示用戶名的字符串計算索引)。
  3. 將原始數組中的所有指針插入新數組後,我必須釋放原始數組的分配內存,並將我的HashSet類(成員專用userContainer)中的指針替換爲新數組的指針(數組)。

問題是,如果我使用delete[] userContainer爲它釋放分配的內存,它也將刪除內存中的每個對象,以便新創建的替換數組將指向內存中釋放的位置!

+0

對不起沒有提及的編程語言。這是C++ –

回答

4

你所描述的聽起來不正確。
比方說,你有一個class A與您共創的A s的磁盤陣列:

A** array1 = new A*[32]; 

然後填充:

for(int i = 0; i < 32; ++i) 
    array1[i] = new A(); 

做一個delete[] array1沒有釋放的array1的元素。

因此,這是安全的:

A** array1 = new A*[32]; 
for(int i = 0; i < 32; ++i) 
    array1[i] = new A(); 

A** arary2 = new A*[64]; 
for(i = 0; i < 32; ++i) 
    array2[i] = array1[i]; 

delete [] array1; 

for(i = 0; i < 32; ++i) 
    // do something with array2[i] 
+0

奇妙的,我現在可以做到:array1 = array2,所以我的類成員現在指向內存中的有效數組? –

+1

是的,在你調用'delete [] array1'之後,你可以設置'array1 = array2',你就完成了,直到它再次滿了! – esskar

2

一般來說,當你刪除一個指針數組時,指針所指向的任何對象都保持存在。實際上,這是潛在的大內存泄漏源。但是在某些引用計數環境(例如Objective-C或Qt)中,當您刪除一個數組OBJECT(而不是簡單的[]數組)時,引用計數遞減,如果計數爲零。

但是,如果你正在重構散列表,你最好在刪除數組之前保存指針值,否則所有尋址的對象將會丟失。當你保存它們時,你可以增加它們的引用計數(如果你正確的話)。

(這將有助於瞭解你正在處理的是什麼語言,您可以通過「陣列」的意思。)

+0

抱歉沒有提及編程語言。它是C++ –

1

你知道malloc/free之間的差異,new/deletenew[]/delete[]? 我想你可能不想在你的情況下使用new[]/delete[],因爲你不想讓析構函數被調用嗎?

+0

我想只釋放原始數組的分配空間,並且仍然有內存中的對象,因爲我已經插入了所需的指針,以使它們位於替換數組中。我不知道malloc/free,new/delete和malloc/free,new []/delete []之間的區別,但我想new/delete和new []/delete []是基於malloc/free的,我可能需要使用malloc/free來達到我的目標。 –

2

我不認爲你的問題的存在。這裏有一個嬰兒例子表明,沒有什麼可擔心的:

Foo * brr[10]; 

{ 
    Foo * arr[10]; 

    // This is not touching the objects! 
    for (Foo * it = arr; it != arr + 10; ++it) *it = new Foo; 

    std::copy(arr, arr + 10, brr); 

} // no more arr 

for (Foo * it = brr; it != brr + 10; ++it) delete *it; // fine 

您可以自由地周圍,就像你喜歡複製三分球。請記住刪除不再需要指針指向的對象

或許微不足道的提醒:指針沒有析構函數;特別是當指針超出範圍時,沒有任何反應

+0

很容易假裝'arr'死亡,只是範圍。 ;) – Xeo

+0

@Xeo:假裝! –