【发布时间】:2012-10-15 05:59:26
【问题描述】:
为什么链表的基于指针的实现需要析构函数和复制构造函数?我试图理解它背后的概念以及它是如何工作的。
【问题讨论】:
-
“为什么需要它们”是什么意思?链表(通常)对节点使用动态分配,并且需要以某种方式清理内存......
标签: c++ constructor linked-list destructor
为什么链表的基于指针的实现需要析构函数和复制构造函数?我试图理解它背后的概念以及它是如何工作的。
【问题讨论】:
标签: c++ constructor linked-list destructor
这是一个所有权问题。通常链表被实现为节点对象的序列,每个节点对象都包含一个指向下一个(和前一个,在双链表的情况下)节点的指针。该列表通常保存指向第一个节点的指针。所以当列表被复制时,需要进行“深度”复制,否则复制的列表最终会指向相同的节点,而你最终会得到两个指向相同结构的对象。这种深拷贝是通过创建一个全新的、动态分配的节点序列来执行的。这就是实现复制构造函数的原因。还必须提供遵循类似逻辑的赋值运算符(请参阅rule of three)。至于析构函数,由于每个列表都拥有自己的节点,并且是动态分配的,所以它必须在销毁时释放资源。
总结:
【讨论】:
一个典型的实现会使用new从堆中分配内存。如果您想在不再需要该对象时释放该内存,则有必要编写一个析构函数,它将delete 列表中的剩余节点释放内存。
【讨论】: