c ++ - 错误的析构函数被调用

时间:2013-07-12 10:01:58

标签: c++ destructor

我对析构函数有一个理解问题。

在以下示例中:

#include <iostream>

using namespace std;

class X{
public:
    int id;
    X(int id){
        this->id = id;
    }
    ~X(){
        cout << "destroying " << id;
    }

};



int main(){


    X a(1);
    a = X(2);


    while(true);
    return 0;

}

我得到以下输出:销毁2

这对我来说完全出乎意料,因为我认为当对象停止存在时,析构函数总是被调用。

但是在这个例子中,它的对象1停止存在并被对象2替换。但是不是调用对象1的析构函数,而是调用对象2的析构函数。

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:5)

在您的情况下,只有一个对象被销毁 - 即,作业右侧的临时X(2)。原始X(1)不会被销毁,因为它会被赋值覆盖。当它被摧毁的时候,它也将打印destroying 2

但是,修改后的X(2)(以X(1)开头)通过无限循环保持活动状态,因此它也不会被破坏。删除无限循环可修复此问题(demo)。

答案 1 :(得分:2)

a = X(2); =&GT;表达式调用赋值运算符和a.id数据成员由temporaryobject.id初始化,即2。

a = X(2); =&GT; expression调用编译器提供的默认赋值运算符并执行淡黄色副本。

X(2)表达式创建临时对象,而temporaryobject.id用2初始化。

当临时对象被另一个对象调用时,第一次解析get调用。