调用了错误的析构函数

wrong destructor gets called

本文关键字:析构函数 错误 调用      更新时间:2023-10-16

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

在以下示例中:

#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的析构因子。

有人能解释一下吗?

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

然而,修改后的X(2)(最初是X(1))通过无限循环保持活动,因此它也不会被破坏。删除无限循环修复了这个问题(演示)。

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

a=X(2);=>表达式调用编译器提供的默认赋值运算符,并执行sallow复制。

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

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