以下程序:
#include <iostream>
using namespace std;
class Test
{
public:
Test() { cout << "Constructor is executed\n"; }
~Test() { cout << "Destructor is executed\n"; }
};
int main()
{
Test(); // Explicit call to constructor
Test t; // local object
t.~Test(); // Explicit call to destructor
return 0;
}
打印以下输出:
Constructor is executed
Destructor is executed
Constructor is executed
Destructor is executed
Destructor is executed
我的问题是,即使在 main() 中显式调用析构函数之后,为什么编译器在退出 main() 之前隐式调用析构函数?
作为一个附带问题,除了在删除运算符中使用之外,是否还有其他使用显式调用析构函数的策略?
您引入了未定义的行为。
根据标准:
§12.4 析构函数
(11) 隐式调用析构函数
(11.3)—对于具有自动存储持续时间的构造对象(3.7.3),当对象所在的块
创建退出 (6.7),
and
15 一旦为一个对象调用了析构函数,该对象就不再存在;该行为是未定义的,如果
为生命周期已结束的对象调用析构函数 (3.8)。 [ 示例:如果析构函数为
自动对象被显式调用,并且该块随后以通常情况下的方式保留
调用隐式销毁对象时,行为未定义。 —结束示例]
您显式调用析构函数或通过调用t.~Test()
,然后当对象离开作用域时隐式调用它。这是未定义的。
该标准还提供了此注释:
14 [ 注意:很少需要显式调用析构函数。此类调用的一种用途是针对放置在特定位置的对象
使用放置新表达式进行寻址。这种对对象的显式放置和销毁的使用可以
有必要处理专用硬件资源和编写内存管理设施。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)