C++ 03 12.4/12关于通过指针显式调用基类析构函数的说法是什么?

sha*_*oth 5 c++ destructor undefined-behavior

根据C++ 03 12.4/12明确调用析构函数时

如果对象不是析构函数的类类型而不是从析构函数的类类型派生的类,则程序具有未定义的行为

所以我有这个代码:

class Base {};
class Derived : public Base {};

char memory[100];
new(memory) Derived();
Base* ptr = (Base*)memory;
ptr->~Base();
Run Code Online (Sandbox Code Playgroud)

这里的对象是类型Derived和"析构函数的类类型" Base,因此看起来根据标准的措辞,UB没有理由.

那么上面的代码是否会根据标准产生UB?

Ste*_*sop 4

正确,没有未定义的行为。

相比之下,在这种情况下,根据所涉及的类型,可能存在潜在的 UB:

Base *ptr = new Derived();
delete ptr;
Run Code Online (Sandbox Code Playgroud)

原因是对于某些类型,实现可能已应用调整以从Derived*Base*。因此,如果没有指向完整对象的指针,就无法正确释放内存分配。虚拟析构函数确保Base子对象为实现提供足够的信息以恢复该信息(虚拟调用机制必须能够恢复指针Derived*以便将其作为传递this)。

但在你的例子中,内存没有被释放,所以没有动力将其变成 UB。当然,这仍然是一个坏主意,因为从概念上讲,该Derived对象处于损坏状态。~Derived你甚至没有合法的打电话方式。在您的示例中,尽管这两种类型都是可破坏的,因此无需调用其中任何一种的析构函数。