我正在處理一項需要我重新實現所有鏈接列表功能的任務。我在理解什麼是解構器或者代碼會是什麼時遇到了一些麻煩。我編寫了一個可以解析列表的代碼,但我認爲這是不對的(見下文)。我也覺得我需要在很多LinkedList函數中調用解構器。有人可以向我解釋這個,並給我一個解構器代碼的樣子嗎?解構鏈接列表
~list()
{
for(int i=0; i<length; i++)
{
pop_front();
}
delete head;
}
我正在處理一項需要我重新實現所有鏈接列表功能的任務。我在理解什麼是解構器或者代碼會是什麼時遇到了一些麻煩。我編寫了一個可以解析列表的代碼,但我認爲這是不對的(見下文)。我也覺得我需要在很多LinkedList函數中調用解構器。有人可以向我解釋這個,並給我一個解構器代碼的樣子嗎?解構鏈接列表
~list()
{
for(int i=0; i<length; i++)
{
pop_front();
}
delete head;
}
除非您的代碼可見,否則無法建議確切的解決方案。如果您正在使用手寫鏈接列表,則需要取消分配所有動態分配的鏈接列表節點。您也可以使用std::list
。
不應該明確調用「析構函數」,但它將作爲delete
調用的一部分進行調用。以破壞0結束鏈接列表的方法之一是(例如僞代碼):
class node {
int data;
node *next;
public:
~node()
{
delete this->next; // this will be chained until NULL is found
}
};
class list {
node *head;
...
public:
~list()
{
delete head;
}
};
然後調用,
由於您沒有做所有列表節點的delete
,因此您有內存泄漏。一個典型的實現可能是這樣的:
For each node in the list
delete node;
Clear the entire list;
此外,
我也印象,我需要調用析構 在許多LinkedList的功能下
無,你不應該從你的任何函數明確調用析構函數。當對象超出範圍或某人做了delete
列表時,它會自動調用。這完全取決於使用list
類的代碼。但是,請注意,您可能想從列表中刪除某個函數(如erase
)中的單個節點,但這並不意味着您必須調用列表的析構函數。
您需要出示'list'class.Also的定義,正確的術語是*析構函數*不*解構器*。 – 2012-02-28 04:32:07