這裏釋放內存的正確方法是什麼? 指針數組包含重複項!刪除包含重複項的指針的動態數組
class HashTable
{
Bucket<E>** index = new Bucket<E>*[indexSize];
...
}
~ExtHash()
{
for (size_t i = 0; i < indexSize; ++i)
delete index[i];
delete[] index;
}
這裏釋放內存的正確方法是什麼? 指針數組包含重複項!刪除包含重複項的指針的動態數組
class HashTable
{
Bucket<E>** index = new Bucket<E>*[indexSize];
...
}
~ExtHash()
{
for (size_t i = 0; i < indexSize; ++i)
delete index[i];
delete[] index;
}
使用了一套刪除重複:
std::set<Bucket*> uniqueBuckets(index, index + indexSize);
for(Bucket* bucket: uniqueBuckets)
delete bucket;
在你的情況下,以這種方式存儲原始指針是危險的。更好地使用std :: shared_ptr並重置共享指針。並且在所有指針將被重置後,它們將被安全地釋放。
也許是這樣的:
~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;
}
排序index
,除去相鄰的重複與std::unique
。 O(N日誌N),並且這是一樣好。
是的,與我答案中的狡猾代碼相比,這樣更高效,更不容易出錯。 – 2012-04-20 12:18:21
我很想知道是否要讓這個容器負責刪除對象;將它們存儲在其他地方會更簡單,只需使用此容器來引用它們,而不是管理它們的生命週期。
或者,您可以使用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;
}
[注:此代碼可能是錯誤的;我當然犯了一些寫錯的錯誤。如果你真的想用強硬的方式來管理動態對象,那麼你需要徹底地測試它]
每次你創建一個指針,它就會變成一個向量。該向量將保存你創建的所有指針,並且只保存其中的每一個。
後來,迭代該向量和delete
指針。 這就像編寫你自己的簡單垃圾回收器。
或者,將對象本身保存在一個列表中(而不是向量,因爲您希望指向它們的指針在添加更多指針時保持有效)。那麼你根本不需要'new'和'delete';該列表將自動銷燬它們給你。 – 2012-04-20 12:35:39
通過你的意思是指向相同的元素重複? – jrok 2012-04-20 12:04:03
是的,像這個索引[0] - > 0x123,索引[1] - > 0x456,索引[2] - > 0x123 – alepfu 2012-04-20 12:08:14
這是不是C++強大的自動? – TMS 2012-04-20 12:09:44