我正在在C 中创建一个基本的链接列表,但是由于某种原因,当我使用信号11运行程序时,我的Destructor segfaults(我使用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;
}
当您在破坏者中执行 delete curr;
时,它将再次调用destructor的该节点,从而导致无尽的递归环,可能会溢出堆栈。
您不应该在灾难中调用有效删除此内容的内容。
而是考虑:
Link::~Link() {
delete next;
}
,在主要中,只需使用delete head;
这仍然是递归的,这可能会出现长列表和小堆栈的问题。另外,您可以将循环放入列表的主要功能中,而不是将循环列入列表。如果要将删除循环封装在类本身中,请添加一个清晰的方法来执行循环。只是不要从destructor中称呼它。