为什么代码两次调用析构函数?

埃利亚希夫

我看了一下这个演示文稿,并在幻灯片379上显示了以下代码(进行了一些小的更改):

#include <iostream>
using namespace std;

struct A
{
    A() { cout << "A()" << endl; }
    A(int v) { cout << "A(int)" << endl; }
    ~A() { cout << "~A()" << endl; }
};

struct X
{
    X(int v) { a = v; }
    X(long v) : a(v) {}
    A a;
};

int main()
{
    cout << "bad style:" << endl;
    { X slow(int(2)); }
    cout << "good style:" << endl;
    { X fast(long(2)); }
}

输出为:

bad style:
A()
A(int)
~A()
~A()
good style:
A(int)
~A()

(此代码在我的计算机上运行,​​使用g ++编译)

现在,我理解了为什么构造函数会以错误的样式被调用两次,但是为什么析构函数会这样做呢?

ro
X(int v) { a = v; }
//         ^^^^^

带下划线的线是作业。有没有operator=接受一个intv),但有一个隐含的转换,从intA因此,将A构造一个临时类型的对象,并将其传递给编译器为您生成的赋值运算符。稍后它会被销毁(在最终创建完整表达式之后),并且还有您没想到的第二个析构函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么析构函数被调用两次?

为什么析构函数调用两次表单?

为什么析构函数被调用两次而构造函数仅被调用一次?

析构函数调用两次

为什么析构函数被两次调用时我的程序不会崩溃

完美的转发,为什么析构函数被调用两次?

为什么将异常的析构函数调用两次?

为什么该程序中的析构函数被调用两次?

为什么std :: shared_ptr两次调用我的析构函数?

类和成员析构函数调用两次

析构函数使用静态对象调用两次

Singleton:析构函数如何被两次调用?

unique_ptr 两次调用析构函数

为什么类的构造函数被调用了四次,而在程序即将结束的时候,析构函数只被调用了两次?

为什么要尝试两次查找析构函数?

为什么在此代码中调用了2次析构函数?

为什么要调用析构函数

为什么不调用析构函数?

参考计数器和析构函数被调用两次

为优化级别为 0 的 std::vector 调用两次析构函数

C ++ make_shared两次调用析构函数

静态unique_ptr两次调用析构函数

在循环内部创建的返回变量导致析构函数被调用两次

vector :: emplace_back结果两次调用析构函数

为什么在下面的代码中两次调用了复制构造函数?

为什么在这段代码片段中复制构造函数被调用了两次?

为什么析构函数比构造函数调用得更多?

为什么在Friend函数中调用析构函数

为什么异步函数被调用两次?