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

皮卡

我正在用 C++ 创建一个基本的链表,但是由于某种原因,当我使用信号 11(我使用 Valgrind 发现)运行程序时,我的析构函数出现了段错误。我的 Link 对象只有两个变量,string value并且Link* 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;
  }
米克尔

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

你不应该在你的析构函数中调用有效的“删除这个”。

而是考虑:

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

在主要,只需使用 delete head;

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章