正在解构链表

Deconstructing Linked List

本文关键字:链表      更新时间:2023-10-16

我正在执行一项任务,该任务要求我重新实现所有链表函数。我很难理解解构主义者做了什么,或者它的代码是什么。我写了一个代码来解构主义列表,但我认为这是不对的(见下文)。我还觉得我需要在许多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等函数中,您可能希望从列表中删除单个节点,但这并不意味着您必须调用列表的析构函数。