调用了错误的析构函数
wrong destructor gets called
我对析构函数有一个理解问题。
在以下示例中:
#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调用。
相关文章:
- 不命名构造函数和析构函数上的类型错误
- 导致 Seg 错误的 SingleLinkedList 的析构函数
- LINUX 操作系统上的错误:令牌之前预期的构造函数、析构函数或类型转换'('?
- 矢量擦除调用的错误析构函数
- 在析构函数中调用"delete"运算符时"compiler is out of heap space"编译器错误
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- 导致堆缓冲区错误的动态分配数组的析构函数
- Qt C++析构函数错误
- C++ 链接列表队列实现和析构函数错误:"Aborted (Core Dumped)"
- 使用此指针时出现C++析构函数错误的原因
- 是否有某种方法可以检测是否使用非虚拟基析构函数错误地删除了类
- 类析构函数错误
- 析构函数错误
- C++动态数组析构函数错误
- c++中对析构函数错误的未定义引用
- 字符数组的析构函数错误
- C++复制构造函数、析构函数错误等
- 无法退出,因为析构函数错误导致main()在退出时停止执行
- 映射析构函数错误
- c++析构函数错误