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それをベクトルに変換します。そのベクトルは、作成されたすべてのポインターを保持し、それぞれを1回だけ保持します。

後で、そのベクトルと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 に答える