我正在用C ++创建一个基本的链接列表,但由于某种原因,当我使用信号11(我发现使用Valgrind)运行程序时,我的析构函数会出现段错误。我的链接对象只有两个变量,
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;
}
答案 0 :(得分:2)
当你在析构函数中执行delete curr;
时,它将再次为该节点调用析构函数,从而导致无休止的递归循环,可能会溢出堆栈。
你不应该打电话给那些有效的&#39;删除这个&#39;在你的析构函数中。
而是考虑:
Link::~Link() {
delete next;
}
主要使用delete head;
这仍然是递归的,这可能是一个长列表和一个小堆栈的问题。或者,您可以将循环放在主要函数中,该函数遍历列表而不是析构函数。如果要在类本身中封装delete循环,请添加一个clear方法来执行循环。只是不要从析构函数中调用它。