【问题标题】:destructor and in linked lists析构函数和链表
【发布时间】:2012-10-15 05:59:26
【问题描述】:

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

【问题讨论】:

标签: c++ constructor linked-list destructor


【解决方案1】:

这是一个所有权问题。通常链表被实现为节点对象的序列,每个节点对象都包含一个指向下一个(和前一个,在双链表的情况下)节点的指针。该列表通常保存指向第一个节点的指针。所以当列表被复制时,需要进行“深度”复制,否则复制的列表最终会指向相同的节点,而你最终会得到两个指向相同结构的对象。这种深拷贝是通过创建一个全新的、动态分配的节点序列来执行的。这就是实现复制构造函数的原因。还必须提供遵循类似逻辑的赋值运算符(请参阅rule of three)。至于析构函数,由于每个列表都拥有自己的节点,并且是动态分配的,所以它必须在销毁时释放资源。

总结:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-12-08
      • 2013-04-26
      • 1970-01-01
      • 2013-03-18
      • 2018-03-27
      • 2016-01-31
      • 2021-07-20
      • 2019-05-14
      相关资源
      最近更新 更多