gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:49:23 24 4
gpt4 key购买 nike

我正在用 C++ 创建一个基本链表,但由于某种原因,当我使用信号 11(我使用 Valgrind 发现)运行程序时,我的析构函数出现了段错误。我的 Link 对象只有两个变量,字符串值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; 时,它将再次为该节点调用析构函数,从而导致无限递归循环,可能会使您的堆栈溢出。

你不应该在你的析构函数中调用有效的'delete this'。

而是考虑:

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

在 main 中,只需使用 delete head;

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

关于c++ - 简单 LinkedList 程序中的析构函数段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43623466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com