在这里释放内存的正确方法是什么? 指针数组包含重复项!
class HashTable
{
Bucket<E>** index = new Bucket<E>*[indexSize];
...
}
~ExtHash( )
{
for (size_t i = 0; i < indexSize; ++i)
delete index[i];
delete[] index;
}
答案 0 :(得分: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 :(得分:2)
排序index
,删除std::unique
的相邻重复项。 O(N log N),它就像它一样好。
答案 2 :(得分:1)
在您的情况下,以这种方式存储原始指针是危险的。更好地使用std :: shared_ptr并重置共享指针。在所有指针重置之后,它们将被安全地释放。
答案 3 :(得分: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;
}
答案 4 :(得分:1)
每次创建指针时,push_back
都会转换为向量。该向量将保存您创建的所有指针,并且只会将它们中的每一个保持一次。
稍后,迭代该向量并delete
指针。
这就像编写自己的简单垃圾收集器。
答案 5 :(得分:1)
使用集合删除重复项:
std::set<Bucket*> uniqueBuckets(index, index + indexSize);
for(Bucket* bucket: uniqueBuckets)
delete bucket;