为什么在同一个对象上隐式调用析构函数两次?

why is a destructor IMPLICITLY called twice on same object?

本文关键字:两次 析构函数 调用 一个对象 为什么      更新时间:2023-10-16

考虑下面的c++代码片段和它下面的输出。

#include <iostream>
using namespace std;
class One {
public:
    One(int num);
    One();
    ~One();
private:
    int number;
};
One::One(int num) {
    number = num;
    cout << "One constructor number = " << number << endl;
}
One::One() {
    number = 0;
    cout << "default One constructorn";
}
One::~One() {
    cout << "One destructor. number = " << number << endl;
    number = 0;
}
int main() {
    One uno;
    uno = One(2);
    return 0;
}
一个构造函数

一个构造函数数= 2

一个析构函数。数字= 2

一个析构函数。数字= 2

注意最后一行的复制。我明白(&为什么默认构造函数由main中的第一行调用,而该实例的析构函数从不调用。相反,第二个实例的析构函数被隐式调用两次。为什么?变量"number"是如何保持在number=2的呢?析构函数将其设置为0。这就像垃圾收集器试图删除由默认构造函数创建的实例,但却碰到了第二个构造函数的旧副本。这是一个微不足道的例子,但在删除指针时,这是一个真正的问题。

One uno;   // Create a default One instance - default constructor called.
uno = One(2); // Create a temporary One instance - number constructor called and prints 2.
              // Assign temporary to uno - uno now has the number 2.
              // Destroy temporary One instance - destructor called and prints 2.
return 0;
// uno destroyed. It has the number 2, so this also prints 2.

或者,根据您看到的输出:

default One constructor // from uno construction
One constructor number = 2 // from temporary One(2) construction
One destructor. number = 2 // from temporary One(2) destruction
One destructor. number = 2 // from uno destruction (since number has changed)