2016-06-08 53 views
-1

在我的代碼中,我製作了一個指向動態分配的類對象的節點列表,我似乎無法弄清楚如何確保我可以自由刪除特定節點時的內存。如何從鏈接列表上的節點釋放內存分配的類

//create temporary node 
node *temp = new node; 
//create the pointer to the class 
Dog *thisDog = new Dog(age, name); 
//set the next pointer to NULL (points to nothing) 
temp->next = NULL; 
//set first value in list to temp 
head = temp; 
//set last value to temp 
last = temp; 

當我刪除節點時,類對象中的析構函數是否會幫我處理這個問題?還是我的節點刪除功能中我應該包括一些諸如下列:

//delete one element 
delete *&thisDog; 
delete head; 
//set the head and last pointer to NULL, point to nothing 
head = NULL; 
last = NULL; 

這裏是我的節點結構:

struct node 
{ 
    Dog *thisDog; 
    node *next; 
}; 
+4

'delete *&thisDog;' - 那個單獨應該是一個指標,可能會發生相反的情況,因爲'delete thisDog;'應該足夠了。並且你打算把'thisDog'放在列表中的某處,因爲這不會發生在你的發佈代碼中。 – WhozCraig

+0

請用相關內容更新您的*問題*。 – WhozCraig

回答

2

你需要明確delete任何你用new分配(除非您使用智能指針包裝,如std::unique_ptrstd::shared_ptr)。您需要deletenode,你需要deleteDog

node *temp = new node; 
... 
delete temp; 

Dog *thisDog = new Dog(age, name); 
... 
delete thisDog; 

如果node意味着擁有Dog對象,那麼你可以在析構函數添加到node以執行delete

struct node 
{ 
    Dog *thisDog; 
    node *next; 

    node() : thisDog(NULL), next(NULL) {} 
    ~node() { delete thisDog; } 
}; 

node *temp = new node; 
node->thisDog = new Dog(age, name); 

... 

delete node; // calls 'delete thisDog'... 

或者,你可以簡單地不使用new在所有分配Dog

struct node 
{ 
    Dog thisDog; 
    node *next; 

    node(int age, string name) : thisDog(age, name), next(NULL) {} 
}; 

node *temp = new node(age, name); 

... 

delete node; // frees 'thisDog' automatically... 

然後當你擁有所有想通了,擺脫你的手動鏈接列表實現並使用std::list來代替,讓它爲您管理節點:

#include <list> 

std::list<Dog> mylist; 

Dog thisDog(age, name); 
mylist.push_back(thisDog); 

Dog thisDog(age, name); 
mylist.push_front(thisDog); 

mylist.pop_back(); 

mylist.pop_front(); 

std::list<Dog>::iterator iter = ...; // any method that returns an iterator to a list element 
mylist.erase(iter); 
+0

非常感謝,這正是我一直在尋找的。我最初試圖不分配任何東西,但這個程序更多的是內存分配的實踐,我自己的內存泄漏。 –