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

标签 c++ destructor undefined-behavior

根据 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/

相关文章:

c++ - 动态无锁内存分配器

c++ - 我应该在析构函数中写入文件末尾吗?

c++ - 构造函数和析构函数必须是虚的?

c - 为什么c中出现 '%' conversions than data arguments错误时输出随机整数?

c - C 中的虚拟继承示例,利用未定义的行为?

c++ - 为什么 unsigned char 具有与其他数据类型不同的默认初始化行为?

c++ - readsome() 是否适合在 Windows 上读取二进制数据?

c++ - 根据对象类调用不同的方法

c++ - 分配没有一维的多维数组

C++ 和析构函数(嵌套类和一般问题)