1

次のヘッダーを考えると:

#ifndef LIST_H
#define LIST_H
#include "ListEle.h"
class List{
private: ListEle* data;
         const List* next;
public:  List(ListEle* d, List* n):data(d),next(n){}
         ~List(){
             if(data!=nullptr)delete data;
             if(next!=nullptr)delete next;
         }
};
#endif

私のリストが再帰的にそれ自体を削除するのは正しいですか?

次に、再帰的なデストラクタ (リスト用) を使用すると、最終的にスタックがスパムになることを示すいくつかのスレッドを読みました。だから私は代替案を検索し、次のような例を見つけました:

~List(){
 delete data;
 List* delptr = next;
  while(delptr!=nullptr){
  List* temp = delptr->next;
  delete delptr;
  delptr = temp;
  }
}

私の考えが正しければ、「delete delptr」行のために、2番目の例も何らかの形で再帰的です。私の考えは、delete delptr が次のリスト項目のデストラクタを呼び出し、それが「delptr」も作成し、次の項目のデストラクタを呼び出し続けるというものです。そのため、スタックは最初の例と同じように見えるはずです。オブジェクトの削除に関する私の理解に誤りがある可能性があると確信しています。現時点では、2 番目の例の while ループは不要だと感じています。

誰かが私の状況を解決するのを手伝ってくれることを願っています。事前に感謝します。

4

1 に答える 1

0

はい、リストは再帰的に削除されます。ただし、リストの途中にある単一のエントリを削除したい場合は、それ以降のすべての要素も削除されるため、それはできません。

他のデストラクタにも同じ問題があります。そして、それはまだ再帰的です。

設計に小さな変更を加えて、 2 つのクラスを使用すると簡単になります。1 つは実際のリスト用で、もう 1 つはリスト内のノード用です。次に、ノードのすべての削除/削除をリストに処理させ、ノード構造をできるだけ単純に保ちます (データとポインターのみ、nextデータと次のポインターを初期化するコンストラクター以外の関数はありません)。

于 2013-05-20T10:11:20.717 に答える