简单链接列表程序中的Destructor segfault



我正在在C 中创建一个基本的链接列表,但是由于某种原因,当我使用信号11运行程序时,我的Destructor segfaults(我使用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;
  }

当您在破坏者中执行 delete curr;时,它将再次调用destructor的该节点,从而导致无尽的递归环,可能会溢出堆栈。

您不应该在灾难中调用有效删除此内容的内容。

而是考虑:

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

,在主要中,只需使用delete head;

这仍然是递归的,这可能会出现长列表和小堆栈的问题。另外,您可以将循环放入列表的主要功能中,而不是将循环列入列表。如果要将删除循环封装在类本身中,请添加一个清晰的方法来执行循环。只是不要从destructor中称呼它。

最新更新