C++ 链表中的析构函数和

C++ 链表中的析构函数和,c++,constructor,linked-list,destructor,C++,Constructor,Linked List,Destructor,为什么基于指针的链表实现需要析构函数和复制构造函数?我试图理解它背后的概念以及它是如何工作的。一个典型的实现将使用new从堆中分配内存。如果您想在不再需要对象时释放该内存,则需要编写析构函数,该析构函数将删除列表中的剩余节点,从而释放内存。一个典型的实现将使用new从堆中分配内存。如果您想在对象不再需要时释放该内存,则需要编写析构函数,该析构函数将删除列表中的剩余节点以释放内存。这是一个所有权问题。通常,链表被实现为节点对象序列,每个节点对象都有一个指向下一个(以及上一个,在双链表的情况下)节点

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

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

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

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

总之:

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

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

    总之:

  • 节点持有指向节点的指针(或智能指针),因为它们不能持有节点对象(无限递归)
  • 列表(应该)保存自己的节点序列,而不是与其他列表共享。这将导致复制和分配时的动态分配
  • 由于列表管理动态分配的资源,因此必须在生命周期结束时清理这些资源。这将导致析构函数(除非使用了智能指针)
  • 这里有一些信息给你。你说的“为什么它们是必要的”是什么意思?链表(通常)对节点使用动态分配,并且需要以某种方式清理内存。。。这里有一些信息给你。你说的“为什么它们是必要的”是什么意思?链表(通常)对节点使用动态分配,并且需要以某种方式清理内存。。。