为什么链表的基于指针的实现需要析构函数和复制构造函数?我试图理解它背后的概念以及它是如何工作的。
问问题
286 次
2 回答
2
一个典型的实现将使用new
. 如果您想在不再需要对象时释放该内存,则有必要编写一个析构函数,它将delete
列表中的剩余节点释放内存。
于 2012-10-25T05:21:48.583 回答
2
这是一个所有权问题。通常,链表被实现为节点对象的序列,每个节点对象都包含一个指向下一个(和前一个,在双链表的情况下)节点的指针。该列表通常包含指向第一个节点的指针。所以当列表被复制时,有必要进行“深度”复制,否则复制的列表最终会指向相同的节点,而你最终会得到两个指向相同结构的对象。这种深拷贝是通过创建一个全新的、动态分配的节点序列来执行的。这就是实现复制构造函数的原因。还需要提供一个遵循类似逻辑的赋值运算符(参见三的规则)。至于析构函数,由于每个链表都拥有自己的节点,并且是动态分配的,所以它必须在销毁时释放资源。
总之:
- 节点持有指向节点的指针(或智能指针),因为它们不能持有节点对象(无限递归)。
- 列表(应该)拥有自己的节点序列,并且不与其他列表共享它们。这导致复制和分配的动态分配。
- 由于它们管理动态分配的资源,因此列表必须在其生命周期结束时清理这些资源。这会导致析构函数(除非使用了智能指针)。
于 2012-10-25T05:36:04.803 回答