是否可以在构造函数之前调用C ++对象实例的析构函数?如果是这样,怎么样?

时间:2014-11-12 17:13:57

标签: c++ c++11

是否可以在构造函数之前调用C ++对象实例的析构函数?

并不是说我真的想要这样做,但我想知道如果它确实是编译器错误的指示,或者是否有一种方法让一些错误的C ++代码导致这种明显不正确的行为(即使这是一个人为的例子。)

当我在时间记录构造函数/析构函数对中注意到测量时间的模式时,我想知道这一点,并且代码包含隐含的假设:析构函数时间> =构造函数时间。

假设这个假设总是正确的,给定相同的时钟......如果违反了,我会怀疑时钟“问题”,然后再怀疑编译器错误。

所以......有可能吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:5)

是的,确定你能做到。它只是UB 最简单的方法是在一个值上调用dtor,无论如何都要明确管理它的生命周期:

union{std::vector<int> v;}; // This disables automatic dtor/ctor calls. Needs C++11
v.~vector<int>();

只有当ctor和/或dtor是微不足道的(也就是无所事事)时,才能在对象之前调用dtor是安全的。
也称为,对象始终初始化。

我实际上并不知道有什么理由打电话给dtor,但从不/在ctor之前 虽然可以想到你想避免打电话的情况。

无论如何,您可能希望确保使用单调时钟源,例如,本地时间(或系统时钟)可以并且可以向后调整(DST,时钟偏差)。

答案 1 :(得分:1)

从技术上讲,可以编写此类代码。但我相信你真的在问,有人会这样做吗?#34;?我无法想象这种情况何时是必要的。所以我认为你可以预期这不应该在正确编写的程序中发生,但请记住,有可能满足这种情况(你可能决定在这种情况下产生诊断)。