2012-02-28 80 views
1

我正在处理一项需要我重新实现所有链接列表功能的任务。我在理解什么是解构器或者代码会是什么时遇到了一些麻烦。我编写了一个可以解析列表的代码,但我认为这是不对的(见下文)。我也觉得我需要在很多LinkedList函数中调用解构器。有人可以向我解释这个,并给我一个解构器代码的样子吗?解构链接列表

~list() 
{ 
    for(int i=0; i<length; i++) 
    { 
     pop_front(); 
    } 
    delete head; 
} 
+1

您需要出示'list'class.Also的定义,正确的术语是*析构函数*不*解构器*。 – 2012-02-28 04:32:07

回答

2

除非您的代码可见,否则无法建议确切的解决方案。如果您正在使用手写链接列表,则需要取消分配所有动态分配的链接列表节点。您也可以使用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; 
    } 
}; 

然后调用,

1

由于您没有做所有列表节点的delete,因此您有内存泄漏。一个典型的实现可能是这样的:

For each node in the list 
    delete node; 

Clear the entire list; 

此外,

我也印象,我需要调用析构 在许多LinkedList的功能下

无,你不应该从你的任何函数明确调用析构函数。当对象超出范围或某人做了delete列表时,它会自动调用。这完全取决于使用list类的代码。但是,请注意,您可能想从列表中删除某个函数(如erase)中的单个节点,但这并不意味着您必须调用列表的析构函数。