ここでメモリを解放する正しい方法は何ですか?ポインタ配列に重複が含まれています!
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
それをベクトルに変換します。そのベクトルは、作成されたすべてのポインターを保持し、それぞれを1回だけ保持します。
後で、そのベクトルとdelete
ポインターを繰り返します。これは、独自の単純なガベージコレクターを作成するようなものです。
セットを使用して重複を削除します。
std::set<Bucket*> uniqueBuckets(index, index + indexSize);
for(Bucket* bucket: uniqueBuckets)
delete bucket;