在对象超出范围后,不会调用析构函数

Ami*_*nos 3 c++

考虑这个例子:

#include <iostream>
using namespace std;

class MyClass
{
public:
    ~MyClass() { cout << "DTOR OK !" << endl; }
};

int main(void)
{
    MyClass test();
    MyClass* pTest = new MyClass();
    delete pTest;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Cor*_*mer 7

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

MyClass test();
Run Code Online (Sandbox Code Playgroud)

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

MyClass test{};
Run Code Online (Sandbox Code Playgroud)

要么

auto test = MyClass();
Run Code Online (Sandbox Code Playgroud)

  • @templatetypedef这不是最令人烦恼的解析 (3认同)