我了解到,当对象超出范围时会调用析构函数,并且析构函数也会删除对象。好的,但是这是怎么回事?

我在显式调用析构函数,如果它删除了对象,那么为什么隐式调用析构函数?即使现在没有对象,因为已经通过显式析构函数调用将其删除。抱歉可能是我在显式和隐式方面做错了,但是请尝试理解我的问题。

#include <iostream>
using namespace std;
class A{
    public:
        A(){
            cout << "Constructor" << endl;
        }
        ~A(){
            cout << "Destructor" << endl;
        }

};
int main(){
    A obj;
    obj.~A();
    cout << "End" << endl;
}


现在

obj.~A();


上一行删除对象。那为什么要再次调用析构函数呢?即使那里没有物体。

输出:

Constructor
Destructor
End
Destructor

最佳答案

超出范围的对象将调用其析构函数。这是C ++语言标准规定的不可更改的保证。事先是否手动调用了析构函数并不重要。当超出范围时,将调用析构函数。如果您编写了析构函数,使得它在被调用两次时发生不好的事情,或者如果编译器插入到析构函数代码中的额外行为不想被调用两次,那么就会发生不好的事情。

这是您永远不要手动调用析构函数的众多原因之一。

关于c++ - 为什么当对象超出范围时我们说析构函数调用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30695641/

10-13 06:31