首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我们说当对象超出作用域时调用析构函数?

为什么我们说当对象超出作用域时调用析构函数?
EN

Stack Overflow用户
提问于 2015-06-07 16:03:47
回答 4查看 2.5K关注 0票数 0

我了解到,当一个对象超出作用域时会调用析构函数,并且析构函数也会删除这些对象。好吧,但这是怎么回事?

我显式地调用析构函数,如果它删除对象,那么为什么要隐式调用析构函数?尽管现在没有对象,因为它已经被显式析构函数调用删除了。抱歉,我可能是明明白白地说错了,但试着理解我的问题。

代码语言:javascript
复制
#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;
}

现在

代码语言:javascript
复制
obj.~A();

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

输出:

代码语言:javascript
复制
Constructor
Destructor
End
Destructor
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-07 16:06:39

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

这是为什么您不应该手动调用析构函数的许多原因之一。

票数 5
EN

Stack Overflow用户

发布于 2015-06-07 16:17:09

您的对象不包含任何指针。当调用时,它不会释放析构函数中的任何对象,因此在多次调用时不会造成任何伤害。如果析构函数删除指针,而这些指针没有设置为0,这通常是析构函数中的情况,那么析构函数的第二个调用将是有害的,因为它会导致内存错误。

票数 1
EN

Stack Overflow用户

发布于 2015-06-07 16:53:11

析构函数不删除对象,而是将其解构。而且,除非对象是POD类型(基本上,您可以在C中定义一些东西),否则破坏已经销毁的对象是未定义的行为。由于所有变量在其生存期结束时都会自动被调用其析构函数,因此您不应该显式地调用它们上的析构函数。类似地,如果您使用new的非放置形式创建了对象:显式调用析构函数将不会释放内存;您应该使用delete,后者调用析构函数,然后释放内存。

您应该显式调用析构函数的唯一时间是在使用新位置构造对象时,以便将分配和初始化分开。今天,这样的技术确实应该被认为是先进的,程序员很少需要它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30695641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档