删除包含重复项的动态指针数组

时间:2012-04-20 12:02:59

标签: c++ arrays duplicates delete-operator

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

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

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

   delete[] index;
 }

6 个答案:

答案 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;