4

自分で作成したリンク リストがあるとします。メモリを解放する独自のデストラクタがあります。この Linked List は、new または delete をオーバーロードしません。

今、私は上記のリンクされたリストの配列を作成しようとしています(私が正しく理解していれば、ハッシュを開きます)。次に、このオープン ハッシュ クラスのコンストラクター内に必要なメモリを割り当てます。コンストラクター内で呼び出される new 演算子は、配列にメモリを正しく割り当てるのに十分ですよね? Linked List クラスの new をオーバーロードしていないため、よくわかりません。

また、リンク リストの配列が要素と呼ばれると仮定すると、デストラクタに「delete[] 要素」と記述できますか? 配列内の各要素のデストラクタを呼び出して、メモリを正しく解放しますか?

最後に、両方の仮定が正しい場合 (つまり、カスタム クラスで使用するために new と delete をオーバーロードする必要がない場合)、そのような演算子をオーバーロードするポイントは何ですか?

4

3 に答える 3

6

うん、君のいうとおりだ。平野

elements = new LinkedList[N];

それらを割り当てるには十分です。その後、それらにアクセスできます

elements[i]->push(....);

あなたが示した方法を使用して、デストラクタでそれらを削除します。

delete[] elements;

コンパイラは割り当てられた要素の数を記憶し、各リストのデストラクタを正しく呼び出します。new および delete 演算子をオーバーロードするポイントは、カスタムのメモリ割り当て戦略を提供することです。たとえば、OS から毎回メモリを割り当てるのではなく、事前にメモリを割り当ててからそのプールから取得することができます。

ただし、コピー コンストラクターとコピー代入演算子も作成する必要があることに注意してください。誰かがあなたのハッシュ マップをコピーした場合、ポインタだけでなく、リンクされたリストもコピーする必要があるためです。または、コピー コンストラクターとコピー代入演算子をプライベートにして定義せずに、ハッシュ マップのコピーを禁止することもできます。

....
private:
    MyHashMap(MyHashMap const& rhs);
    MyHashMap & operator=(MyHashMap const& rhs);
....
于 2008-12-25T02:51:39.707 に答える
3

new演算子は、メモリの割り当てとコンストラクターの呼び出しという 2 つのことを行います。

delete演算子はデストラクタを呼び出してから、メモリを解放します。

new []で作成された配列は、 delete[]で破棄する必要があります。

通常、パフォーマンス上の理由を除いて、newまたはdeleteをオーバーロードする必要はありません。特定の割り当て戦略を非常に適切にする割り当て/割り当て解除の予測可能なパターンがある場合があります (高速または低メモリ使用)。

このページをご覧になることをお勧めします。

于 2008-12-25T03:00:23.027 に答える
1

あなたの仮定はすべて正しいです。

new と delete のオーバーロードには多くの用途がありますが、頻繁には行われません。一般的な理由の 1 つは、メモリ リークを見つけるためにメモリ割り当てを追跡することです。多くのコンパイル時リーク トラッカーがこれを行っていますが、valgrind のようなより優れた外部アプリでは時代遅れになっています。プールされたメモリを使用するなどのこともできます。

于 2008-12-25T02:54:07.020 に答える