为什么在同一个对象上隐式调用析构函数两次?
why is a destructor IMPLICITLY called twice on same object?
考虑下面的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)
相关文章:
- C++析构函数调用两次,堆栈分配的复合对象
- 有一个构造函数,但有两个析构函数
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 两个单链列表共享同一个节点和析构函数两次删除相同的内存
- 析构函数在 lambda 捕获说明符中声明的类实例上运行两次
- 为什么在这里调用析构函数两次
- 析构函数在与 STL 的共享指针中调用两次
- 类析构函数在创建shared_ptr时调用两次
- [c++]为什么我的类析构函数被调用两次?
- 为什么这个程序中的析构函数被调用两次
- 显式调用析构函数时被调用两次
- 为什么析构函数被调用两次,而构造函数只被调用一次
- 如何正确地将对象添加到向量,而无需两次调用析构函数
- 为什么代码调用析构函数两次
- C++11 右值调用析构函数两次
- 在为对象调用析构函数时,它被调用两次
- 对于在同一地址构造两次的对象,编译器如何知道必须调用第二个析构函数
- 为什么我的程序不崩溃,如果析构函数被调用两次
- 为什么在这种情况下只调用一个构造函数而调用两个析构函数