如何在链表中对析构函数进行递归调用?

pok*_*che 3 c++

我正在阅读这篇博客文章,并发现了这段代码.

#include <iostream>
#include <string>

using namespace std;

struct LNode {
   int data;
   LNode* next;

   LNode(int n){data = n; next = nullptr;}

   void add_to_end(int n) {
      if (next)
         next->add_to_end(n);
      else
         next = new LNode(n);
   }
   ~LNode() { cout << " I am from LNode Destructor " << endl; delete next; }
};

int main()
{   
   LNode root(1);
   root.add_to_end(2);
   root.add_to_end(3);
   root.add_to_end(4);

}
Run Code Online (Sandbox Code Playgroud)

这段代码的输出是

 I am from LNode Destructor 
 I am from LNode Destructor 
 I am from LNode Destructor 
 I am from LNode Destructor 
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我一直认为我必须使用某种while或for循环遍历链表,然后继续删除我使用new动态分配的所有节点.但是在上面的代码中,析构函数是如何被调用四次的,它是如何自动遍历链表创建这种多米诺骨牌效应(完全删除分配的内存本身).

Gal*_*lik 7

这段代码:

~LNode() { delete next; } // destructor
Run Code Online (Sandbox Code Playgroud)

如果next设置为0,NULL或nullptr什么都不会发生.但是,如果将其设置为以下地址,LNode则将导致以下LNode's 析构函数运行.它的析构函数会做同样的事情,导致它的后续LNode被破坏等等,直到你遇到一个next等于的变量nullptr.

  • @pokche你有一个对象列表,所有对象都有一个指向下一个对象的`next`指针.当你在第一个对象上调用`delete`时,它的析构函数调用*on*next对象上的delete,它在*它的*next对象等上调用`delete` ..直到没有下一个对象,因为指针是`nullptr`. (2认同)