2

一方向のリストを作りたいのですが、ここで無限ループが発生する理由がわかりません。問題は clearList() メソッドにあります

class List
{
private:
  Document document;
  List* nextPtr;
public:
  List()
    :document(), nextPtr(NULL)
  {
    cout << "class List: CONSTRUCTOR (default)\n";
  }

  List(const Document& d)
    :nextPtr(NULL)
  {
    cout << "class List: CONSTRUCTOR (init)\n";
    document = d;
  }

  ~List()
  {
    cout << "class List: DESTRUCTOR\n";
    freeList(this);
  }

  void freeList(List* top)
  {
    if(top != NULL)
      freeList(top->nextPtr);
    delete top;
  }
};

主なプログラムは次のとおりです。

int main()
{
  List list1;

  return 0;
}

そして、ここに私が持っているものがあります

ここに画像の説明を入力

4

3 に答える 3

4

Listオブジェクトが破壊されると、デストラクタが呼び出します。freeListこれは、がどこdelete topにあるかを実行し、それ自体を再び破壊します。その後、デストラクタは再度呼び出します。topthisfreeList

本当にあなたはこれを行うデストラクタが欲しいだけのようです:

~List()
{
  cout << "class List: DESTRUCTOR\n";
  delete nextPtr;
}

deleteofは次ののデストラクタnextPtrを呼び出し、それは次ののポインタなどを呼び出します。効果がないため、これは停止します。ListdeleteListnextPtrNULLdelete NULL;

于 2012-12-22T22:44:08.363 に答える
2

あなたのdestructor呼び出しfreeList、それから呼び出しdelete、それはあなたのを呼び出すつもりdestructorです。これはひどく終わります!

于 2012-12-22T22:45:22.950 に答える
1

すでに範囲外になっているオブジェクトを削除しています。

つまり、 で~List()呼び出すfreeListthis、 がdelete再度~List()呼び出されます。

スタックに割り当てられたオブジェクトを削除しないでください。

于 2012-12-22T22:43:04.220 に答える