我正在阅读这篇博客文章,并发现了这段代码.
#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动态分配的所有节点.但是在上面的代码中,析构函数是如何被调用四次的,它是如何自动遍历链表创建这种多米诺骨牌效应(完全删除分配的内存本身).
这段代码:
~LNode() { delete next; } // destructor
Run Code Online (Sandbox Code Playgroud)
如果next设置为0,NULL或nullptr什么都不会发生.但是,如果将其设置为以下地址,LNode则将导致以下LNode's 析构函数运行.它的析构函数会做同样的事情,导致它的后续LNode被破坏等等,直到你遇到一个next等于的变量nullptr.