2017-04-26 73 views
0

我在C++中创建了一个基本链接列表,但由于某种原因,当我用信号11(我发现使用Valgrind)运行程序时,析构函数发生了段错误。我的链接对象只有两个变量, string valueLink* next简单LinkedList程序中的析构函数段错误

这是析构函数。

​​

这是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; 
    } 
+1

1 .:'head->〜Link();'不要这样做。 2:'删除curr;'你从析构函数中删除'this'。 – tkausl

+0

那我该怎么做?我很新C++ – Kek

+1

显式调用析构函数通常不是正确的路径。 –

回答

2

当你在析构函数中执行delete curr;时,它将再次为该节点调用析构函数,导致无限的递归循环,可能会导致堆栈溢出。

你不应该在你的析构函数中调用什么有效的“删除这个”。

而是考虑:

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

而且在主,只需使用delete head;

这仍然是递归的,它可以是一个长长的清单和一小叠问题。或者,你可以把循环放在你的主函数中,而不是在析构函数中。如果你想在类本身封装删除循环,添加一个清除方法来执行循环。只是不要从析构函数中调用它。

+1

而解决方法是(我认为)在main()中调用'delete head;'' ,然后在析构函数中只删除下一个;注意'delete nullptr; [是安全的](https://stackoverflow.com/questions/4190703/is-it-safe-to-delete-a-null-指针)。 –