我了解到,当对象超出范围时会调用析构函数,并且析构函数也会删除对象。好的,但是这是怎么回事?
我在显式调用析构函数,如果它删除了对象,那么为什么隐式调用析构函数?即使现在没有对象,因为已经通过显式析构函数调用将其删除。抱歉可能是我在显式和隐式方面做错了,但是请尝试理解我的问题。
#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/