我了解到,当一个对象超出作用域时会调用析构函数,并且析构函数也会删除这些对象。好吧,但这是怎么回事?
我显式地调用析构函数,如果它删除对象,那么为什么要隐式调用析构函数?尽管现在没有对象,因为它已经被显式析构函数调用删除了。抱歉,我可能是明明白白地说错了,但试着理解我的问题。
#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发布于 2015-06-07 16:06:39
超出作用域的对象被调用其析构函数。这是C++语言标准要求的不可更改的保证。如果您事先手动调用了析构函数,这并不重要;当它超出作用域时,将调用析构函数。如果您已经编写了析构函数,如果它被调用了两次,或者编译器插入到析构函数代码中的额外行为不想被调用两次,那么坏的事情就会发生。
这是为什么您不应该手动调用析构函数的许多原因之一。
发布于 2015-06-07 16:17:09
您的对象不包含任何指针。当调用时,它不会释放析构函数中的任何对象,因此在多次调用时不会造成任何伤害。如果析构函数删除指针,而这些指针没有设置为0,这通常是析构函数中的情况,那么析构函数的第二个调用将是有害的,因为它会导致内存错误。
发布于 2015-06-07 16:53:11
析构函数不删除对象,而是将其解构。而且,除非对象是POD类型(基本上,您可以在C中定义一些东西),否则破坏已经销毁的对象是未定义的行为。由于所有变量在其生存期结束时都会自动被调用其析构函数,因此您不应该显式地调用它们上的析构函数。类似地,如果您使用new的非放置形式创建了对象:显式调用析构函数将不会释放内存;您应该使用delete,后者调用析构函数,然后释放内存。
您应该显式调用析构函数的唯一时间是在使用新位置构造对象时,以便将分配和初始化分开。今天,这样的技术确实应该被认为是先进的,程序员很少需要它们。
https://stackoverflow.com/questions/30695641
复制相似问题