在这里释放内存的正确方法是什么?指针数组包含重复项!
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::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;
}
[注意:此代码很可能是错误的;我在写它时确实犯了几个错误。如果您真的想以艰难的方式管理动态对象,那么您需要彻底测试它]
排序index
,删除相邻的重复项std::unique
。O(N log N) 和它一样好。
在您的情况下,以这种方式存储原始指针是危险的。更好地使用 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;
}
每次创建一个指针时,push_back
它都会变成一个向量。该向量将保存您创建的所有指针,并且每个指针仅保存一次。
稍后,迭代该向量和delete
指针。这就像编写自己的简单垃圾收集器一样。
使用集合删除重复项:
std::set<Bucket*> uniqueBuckets(index, index + indexSize);
for(Bucket* bucket: uniqueBuckets)
delete bucket;