简单LinkedList程序中的析构函数段错误

时间:2017-04-26 01:23:47

标签: c++

我正在用C ++创建一个基本的链接列表,但由于某种原因,当我使用信号11(我发现使用Valgrind)运行程序时,我的析构函数会出现段错误。我的链接对象只有两个变量, string valueLink* next

这是析构函数。

Link::~Link() {
  Link* curr = this;
  while (curr != NULL) {
    Link* nextLink = curr->next;
    delete curr;
    curr = nextLink;
 }
}

这是main.cpp

int main() {

  string temp;
  getline(cin, temp);
  Link* head = new Link(temp, NULL);
  Link* tempHead = head;

  for(int i = 1; i < 5; i++) {
    getline(cin, temp);
    Link* newLink = new Link(temp, head);
    head = newLink;
  }
  head->printAll(head);
  head->~Link();

  return 0;

}

编辑: 对于link.cpp,我这样做了 -

Link::~Link() {
  Link* curr = this;
  delete curr;
}

然后对于main.cpp,我将head->~Link()更改为

  Link* curr = tempHead;
  while(curr!=NULL) {
    Link* nextLink = curr->getNext();
    curr->~Link();   //replacing with delete curr gives the same segfault
    curr = nextLink;
  }

1 个答案:

答案 0 :(得分:2)

当你在析构函数中执行delete curr;时,它将再次为该节点调用析构函数,从而导致无休止的递归循环,可能会溢出堆栈。

你不应该打电话给那些有效的&#39;删除这个&#39;在你的析构函数中。

而是考虑:

Link::~Link() {
      delete next;
}

主要使用delete head;

这仍然是递归的,这可能是一个长列表和一个小堆栈的问题。或者,您可以将循环放在主要函数中,该函数遍历列表而不是析构函数。如果要在类本身中封装delete循环,请添加一个clear方法来执行循环。只是不要从析构函数中调用它。