我正在用 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] 删除。
我来说两句