为什么我的C ++程序中存在无限循环?

时间:2012-12-22 22:38:05

标签: c++ recursion

我想制作单向列表,但我无法找到为什么会出现无限循环。问题出在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;
}

这就是我所拥有的

enter image description here

3 个答案:

答案 0 :(得分:4)

当您的List对象被销毁时,析构函数将调用freeListdelete top topthis,导致自身再次被销毁。然后析构函数将再次调用freeList,依此类推。等等。

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

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

delete的{​​{1}}会调用下一个nextPtr的析构函数,List将指向下一个delete的指针,依此类推。这将在ListnextPtr时停止,因为NULL无效。

答案 1 :(得分:2)

您的destructor来电freeList,然后拨打delete,呼叫您destructor。这将会非常糟糕!

答案 2 :(得分:1)

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

也就是说,~List()使用freeList调用thisdelete会再次调用~List()

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