为什么析构函数和复制构造函数是基于指针的链表实现所必需的?我试图理解它背后的概念以及它是如何工作的。
答案 0 :(得分:2)
典型的实现将使用new
从堆中分配内存。如果你想在不再需要该对象时释放该内存,那么就必须编写一个析构函数,它将delete
列表中剩余的节点释放内存。
答案 1 :(得分:2)
这是一个所有权问题。通常,链接列表被实现为节点对象的序列,其中每个节点对象保持指向下一个(以及在双链接列表的情况下为前一个)节点的指针。该列表通常包含指向第一个节点的指针。因此,当复制列表时,必须执行“深度”复制,否则复制的列表最终指向相同的节点,最终会有两个指向同一结构的对象。通过创建全新的动态分配的节点序列来执行此深层复制。这是实现复制构造函数的原因。还必须提供遵循类似逻辑的赋值运算符(参见rule of three)。对于析构函数,由于每个列表都拥有其节点,并且已动态分配它们,因此必须在销毁时释放资源。
总结: