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

时间:2017-02-13 18:38:43

标签: 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;
}

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

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

2 个答案:

答案 0 :(得分:7)

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

MyClass test();

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

MyClass test{};

auto test = MyClass();

答案 1 :(得分:2)

&#34; MyClass test();&#34; - 你想写MyClass test; - 你没有创建一个对象,你正在声明一个函数&#34; test&#34;不带参数并返回&#34; MyClass&#34;。