c++析构函数在同一对象上被调用2次
c++ destructor getting called 2 times on the same object?
我有以下代码片段:
#include<iostream>
using namespace std;
class Test {
public:
Test() { cout << "Constructor is executedn"; }
~Test() { cout << "Destructor is executedn";}
void show() { this->Test::~Test(); }
};
int main() {
Test t;
t.show();
return 0;
}
这是输出:
Constructor is executed
Destructor is executed
Destructor is executed
问题:如果t.show()
已经调用了"this"对象(即当前对象)上的析构函数,导致"destructor is execute"显示一次,那么是什么导致它第二次显示?在这种情况下,哪个物体会被摧毁?
当自动变量超出范围时,它们会被销毁。CCD_ 2是当CCD_ 3结束时超出范围的自动变量。这是第二次调用析构函数。第一次是通过Test::show
,因为函数手动销毁了this
指向的对象。
由于C++遵循的哲学是不为不使用的东西付费,因此在对超出范围的自动变量调用析构函数之前,没有任何类型的运行时检查。当然,实际发生在第二个析构函数调用上的是UB。小心鼻腔恶魔。
Pradhan给了你一个易于理解的解释,我将分享处理对具有自动存储持续时间的对象的显式析构函数调用的特定规则,见标准的3.8p8节:
如果程序以静态、线程或自动存储持续时间结束
T
类型对象的生存期,并且T
具有非平凡的析构函数,则程序必须确保在隐式析构函数调用发生时,原始类型的对象占据相同的存储位置;否则程序的行为是未定义的。即使块退出时出现异常,情况也是如此。
你违反了这个规则,所以你得到了未定义的行为。
6.7p2中描述了"隐式析构函数调用":
每次执行声明语句时,都会初始化具有自动存储持续时间的变量。块中声明的具有自动存储持续时间的变量在从块
相关文章:
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 什么是仅调用一次并调用参数的控制台应用
- C++析构函数调用两次,堆栈分配的复合对象
- 谷歌基准测试,如何只调用一次代码?
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- Singleton模式中的手动析构函数调用:调用多次
- Android JNI RegisterNatives:对所有内容调用一次,或者每个函数调用一次
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 系统调用:一次和多次,哪个更好?
- 重载运算符 new(),为什么构造函数被调用两次?
- 当 reset() 被unique_ptr调用两次时会发生什么?
- CEdit 框的NM_KILLFOCUS被调用两次
- C++菱形问题 - 如何仅调用一次基方法
- 为什么这个构造函数被调用两次
- 析构函数在与 STL 的共享指针中调用两次
- 函数被多次执行,同时调用一次
- 为什么当我创建 N 个对象的向量时不调用 N 次 CTOR
- 为什么我的析构函数被调用多次