0

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

4

2 回答 2

2

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

于 2012-10-25T05:21:48.583 回答
2

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

总之:

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