对于超出范围和主程序结束的对象,不调用析构函数

dan*_*ucs 0 c++ oop destructor

我有以下代码


#include <bits/stdc++.h>

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    ~TreeNode() {
        std::cout << "are we in here";
    }
};


int main()
{
    if(1 < 2) {
        TreeNode *testing = new TreeNode(15);
        //why is the destructor not called here?
    }
    TreeNode *root = new TreeNode(15);
    root->left = new TreeNode(10);
    root->right = new TreeNode(20);
    root->left->left = new TreeNode(8);
    root->left->right = new TreeNode(12);
    root->right->left = new TreeNode (16);
    root->right->right = new TreeNode(25);
    //why  is the destructor not being called here?
}
Run Code Online (Sandbox Code Playgroud)

在这两条评论中,我想知道为什么析构函数没有被调用?如果我没记错的话,当对象超出范围时,应该调用析构函数。然而,当指针超出 if 语句的范围以及 main 完成时,TreeNode 析构函数永远不会被调用

小智 5

C++ 的黄金法则之一是,如果您使用new某些东西,您也应该使用delete它。当您使用 时new,您是在告诉编译器您现在负责管理该变量的生命周期。

  • 从技术上讲,不是*变量的*生命周期,而是*对象的*(此代码中的变量是一个指针,其生命周期仍然是自动的)。 (3认同)