2017-04-26 51 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-指針)。 –