1

在这里释放内存的正确方法是什么?指针数组包含重复项!

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

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

   delete[] index;
 }
4

6 回答 6

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;
}

[注意:此代码很可能是错误的;我在写它时确实犯了几个错误。如果您真的想以艰难的方式管理动态对象,那么您需要彻底测试它]

于 2012-04-20T12:11:32.450 回答
2

排序index,删除相邻的重复项std::unique。O(N log N) 和它一样好。

于 2012-04-20T12:10:28.853 回答
1

在您的情况下,以这种方式存储原始指针是危险的。更好地使用 std::shared_ptr 并重置共享指针。并且在所有指针都将被重置之后,它们将被安全地释放。

于 2012-04-20T12:07:53.687 回答
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;
 }
于 2012-04-20T12:09:35.220 回答
1

每次创建一个指针时,push_back它都会变成一个向量。该向量将保存您创建的所有指针,并且每个指针仅保存一次。

稍后,迭代该向量和delete指针。这就像编写自己的简单垃圾收集器一样。

于 2012-04-20T12:30:49.647 回答
1

使用集合删除重复项:

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

for(Bucket* bucket: uniqueBuckets)
    delete bucket;
于 2012-04-20T12:52:01.263 回答