0

リンク リストのポインタ ベースの実装にデストラクタとコピー コンストラクタが必要なのはなぜですか? その背後にある概念と、それが正確にどのように機能するかを理解しようとしています。

4

2 に答える 2

2

所有権の問題です。通常、連結リストは一連のノード オブジェクトとして実装され、それぞれが次の (二重連結リストの場合は前の) ノードへのポインタを保持します。リストは通常​​、最初のノードへのポインターを保持します。したがって、リストをコピーするときは、「ディープ」コピーを実行する必要があります。そうしないと、コピーされたリストが同じノードを指すことになり、2 つのオブジェクトが同じ構造を指すことになります。このディープ コピーは、動的に割り当てられた完全に新しい一連のノードを作成することによって実行されます。これが、コピー コンストラクターを実装する理由です。同様のロジックに従って代入演算子を提供することも必要です ( 3 つのルールを参照)。)。デストラクタに関しては、各リストがノードを所有し、それらを動的に割り当てているため、破棄時にリソースを解放する必要があります。

要約すれば:

  1. ノードはノード オブジェクトを保持できないため (無限再帰)、ノードへのポインター (またはスマート ポインター) を保持します。
  2. リストは、独自のノードのシーケンスを保持 (する必要があります) し、それらを他のリストと共有しません。これにより、コピーと割り当てで動的割り当てが行われます。
  3. これらは動的に割り当てられたリソースを管理するため、リストは有効期間の終わりにこれらをクリーンアップする必要があります。これはデストラクタにつながります (スマート ポインタが使用されていない場合)。
于 2012-10-25T05:36:04.803 に答える
2

典型的な実装では、 を使用してヒープからメモリを割り当てますnew。オブジェクトが不要になったときにそのメモリを解放したい場合はdelete、リスト内の残りのノードがメモリを解放するデストラクタを記述する必要があります。

于 2012-10-25T05:21:48.583 に答える