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对象被销毁时,析构函数将调用freeListwhich will do delete topwhere topis this,导致自身再次被销毁。然后析构函数将再次调用freeList,依此类推。

似乎真的你只想要一个析构函数来做到这一点:

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

deleteof将nextPtr调用 nextList的析构函数,这将是delete其 nextList的指针,依此类推。nextPtr这将在isNULL因为delete NULL;没有效果时停止。

于 2012-12-22T22:44:08.363 回答
2

您的destructor呼叫freeList,然后呼叫delete,这将呼叫您的destructor。这将是糟糕的结局!

于 2012-12-22T22:45:22.950 回答
1

您正在删除一个已经超出范围的对象。

也就是说,~List()调用freeListwith this,这delete会导致~List()再次调用。

您不应该删除堆栈分配的对象。

于 2012-12-22T22:43:04.220 回答