析构函数和链表

时间:2012-10-25 05:18:27

标签: c++ constructor linked-list destructor

为什么析构函数和复制构造函数是基于指针的链表实现所必需的?我试图理解它背后的概念以及它是如何工作的。

2 个答案:

答案 0 :(得分:2)

典型的实现将使用new从堆中分配内存。如果你想在不再需要该对象时释放该内存,那么就必须编写一个析构函数,它将delete列表中剩余的节点释放内存。

答案 1 :(得分:2)

这是一个所有权问题。通常,链接列表被实现为节点对象的序列,其中每个节点对象保持指向下一个(以及在双链接列表的情况下为前一个)节点的指针。该列表通常包含指向第一个节点的指针。因此,当复制列表时,必须执行“深度”复制,否则复制的列表最终指向相同的节点,最终会有两个指向同一结构的对象。通过创建全新的动态分配的节点序列来执行此深层复制。这是实现复制构造函数的原因。还必须提供遵循类似逻辑的赋值运算符(参见rule of three)。对于析构函数,由于每个列表都拥有其节点,并且已动态分配它们,因此必须在销毁时释放资源。

总结:

  1. 节点将指针(或智能指针)保存到节点,因为它们无法保存节点对象(无限递归)。
  2. 列表(应该)拥有自己的节点序列,不与其他列表共享。这导致了复制和分配的动态分配。
  3. 由于他们管理动态分配的资源,因此列表必须在其生命周期结束时清除这些资源。这会导致析构函数(除非使用了智能指针)。