对象超出作用域后析构函数未被调用

3
考虑这个例子:
#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”的析构函数没有被调用?

当析构函数是私有的时候,我注意到delete pTest;只会导致编译错误,而不是对于本地对象。这里发生了什么?


好的。所以它是“Most”。我在寻找重复项时记不清是“most”还是“non-most”。 - user4581301
1
没问题,因为构造函数也没有被调用。 - AnT stands with Russia
2个回答

7

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

MyClass test();

如果您更改为统一初始化语法,您将看到两个析构函数调用。
MyClass test{};

或者

auto test = MyClass();

1
为了完整性,这被称为“最令人烦恼的解析”。可能最好注明一下,以便OP以后可以搜索它。 :-) - templatetypedef
3
这不是最令人烦恼的解析。 - NathanOliver
好的,我原以为我们不能在main()函数内部放置函数原型,但显然我们只能放置实现... - Aminos
1
@Aminos 好的,我以为我们不能在main()函数内部放置函数原型 -- 顺便说一下,这个特性从古老的C语言就存在了。 - PaulMcKenzie
@NathanOliver 我的印象是最令人烦恼的解析是“一个看起来像变量声明但实际上是函数声明的语句”的通用术语。这个理解不正确吗?我很乐意接受纠正! - templatetypedef

2
你想写的是MyClass test;,而不是MyClass test();。前者并非创建对象,而是声明一个不带参数且返回类型为"MyClass"的函数"test"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接