对象超出范围后未调用析构函数

destructor is not being called after object goes out of scope

本文关键字:调用 析构函数 范围 对象      更新时间:2023-10-16

考虑这个例子:

#include <iostream>
using namespace std;
class MyClass
{
public:
    ~MyClass() { cout << "DTOR OK !" << endl; }
};
int main(void)
{
    MyClass test();
    MyClass* pTest = new MyClass();
    delete pTest;
}

为什么"DTOR OK!"没有打印两次? 为什么不调用本地对象"test"的析构函数?

当析构函数是私有的时,我注意到删除 pTest 只有一个编译错误; 但对于本地对象则不是? 这里发生了什么?

这一行实际上声明了一个函数,而不是一个变量。

MyClass test();

如果要更改为统一初始化语法,则会看到两个 destuctor 调用

MyClass test{};

auto test = MyClass();

"MyClass test((;" - 你想写MyClass test; - 你不是在创建一个对象,你是在声明一个函数"test",它不接受参数并返回一个"MyClass"。