2012-04-20 59 views
1

這裏釋放內存的正確方法是什麼? 指針數組包含重複項!刪除包含重複項的指針的動態數組

class HashTable 
{ 
    Bucket<E>** index = new Bucket<E>*[indexSize]; 
    ... 
} 

~ExtHash() 
{ 
    for (size_t i = 0; i < indexSize; ++i) 
    delete index[i]; 

    delete[] index; 
} 
+0

通過你的意思是指向相同的元素重複? – jrok 2012-04-20 12:04:03

+0

是的,像這個索引[0] - > 0x123,索引[1] - > 0x456,索引[2] - > 0x123 – alepfu 2012-04-20 12:08:14

+0

這是不是C++強大的自動? – TMS 2012-04-20 12:09:44

回答

1

使用了一套刪除重複:

std::set<Bucket*> uniqueBuckets(index, index + indexSize); 

for(Bucket* bucket: uniqueBuckets) 
    delete bucket; 
1

在你的情況下,以這種方式存儲原始指針是危險的。更好地使用std :: shared_ptr並重置共享指針。並且在所有指針將被重置後,它們將被安全地釋放。

1

也許是這樣的:

~ExtHash() 
{ 
    std::sort(index, index + indexSize); 
    size_t new_end = std::unique(index, index + indexSize) - index; 

    for (size_t i = 0; i < new_end; ++i) 
    delete index[i]; 

    delete[] index; 
} 
2

排序index,除去相鄰的重複與std::unique。 O(N日誌N),並且這是一樣好。

+0

是的,與我答案中的狡猾代碼相比,這樣更高效,更不容易出錯。 – 2012-04-20 12:18:21

3

我很想知道是否要讓這個容器負責刪除對象;將它們存儲在其他地方會更簡單,只需使用此容器來引用它們,而不是管理它們的生命週期。

或者,您可以使用std::shared_ptr來管理對象;那麼當它們全部丟棄時它們將被自動刪除。

如果你真的想這樣做,你需要在刪除每個重複項後刪除重複;像

for (size_t i = 0; i < indexSize; ++i) { 
    Bucket<E> * victim = index[i]; 
    indexSize = std::remove(index+i+1, index+indexSize, victim) - index; 
    delete victim; 
} 

[注:此代碼可能是錯誤的;我當然犯了一些寫錯的錯誤。如果你真的想用強硬的方式來管理動態對象,那麼你需要徹底地測試它]

1

每次你創建一個指針,它就會變成一個向量。該向量將保存你創建的所有指針,並且只保存其中的每一個。

後來,迭代該向量和delete指針。 這就像編寫你自己的簡單垃圾回收器。

+0

或者,將對象本身保存在一個列表中(而不是向量,因爲您希望指向它們的指針在添加更多指針時保持有效)。那麼你根本不需要'new'和'delete';該列表將自動銷燬它們給你。 – 2012-04-20 12:35:39