在调用对象的析构函数时,它被调用两次?

use*_*190 4 c++ destructor

在显式调用析构函数时,它会执行两次.这是什么原因?

#include <iostream>
using namespace std;

class A
{
    public:
        int x;

        A() { cout << "A's constructor called " << endl;  }

        ~A(){
            cout<<"A's desctructor called "<<endl;
        }
};

int main()
{
    A a;
    A b;
    a.~A();
}
Run Code Online (Sandbox Code Playgroud)

输出:

称为A的构造
A的desctructor称为
叫A的desctructor

bma*_*ies 6

好吧,你把它称为'a',然后当语言超出范围时,'语言'再次称它为'a'.然后,当然,'语言'称之为b.当然,"语言"是指自动范围对象在其范围初始化时被构造,并在范围结束时被破坏的非常基本的规则.

使用显式调用析构函数很少是一个好主意.


Jak*_*old 5

您不应该手动调用析构函数,当对象超出范围时,它将自动调用.

手动调用析构函数的唯一地方是当你编写自己的分配器时,但这是一个非常高级的主题,因此经验法则是永远不要手动调用析构函数.