根据 C++03 12.4/12 当显式调用析构函数时
if the object is not of the destructor’s class type and not of a class derived from the destructor’s class type, the program has undefined behavior
所以我有这段代码:
class Base {};
class Derived : public Base {};
char memory[100];
new(memory) Derived();
Base* ptr = (Base*)memory;
ptr->~Base();
这里对象的类型是 Derived
并且“析构函数的类类型”是 Base
所以根据标准措辞看起来没有 UB 的理由.
那么上面的代码是否会根据标准产生 UB?
最佳答案
正确,没有未定义的行为。
相比之下,根据所涉及的类型,在这种情况下存在潜在的 UB:
Base *ptr = new Derived();
delete ptr;
原因是对于某些类型,实现可能已应用调整以从 Derived*
变为 Base*
。因此,如果没有指向完整对象的指针,就无法正确释放内存分配。虚拟析构函数确保 Base
子对象为实现提供足够的信息来恢复(虚拟调用机制必须能够恢复 Derived*
指针,以便将其作为 this
传递)。
但在您的示例中,内存未被释放,因此没有动力使其成为 UB。当然,这仍然是个坏主意,因为从概念上讲,Derived
对象处于损坏状态。您甚至没有合法的方式来调用 ~Derived
。在您的示例中,尽管这两种类型都可以轻易破坏,因此不需要调用其中任何一种的析构函数。
关于c++ - C++03 12.4/12 中关于通过指针显式调用基类析构函数的说法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20560728/