【发布时间】:2013-12-31 21:08:41
【问题描述】:
当显式调用析构函数时,根据 C++03 12.4/12
如果对象不是析构函数的类类型并且不是从析构函数的类类型派生的类,则程序具有未定义的行为
所以我有这个代码:
class Base {};
class Derived : public Base {};
char memory[100];
new(memory) Derived();
Base* ptr = (Base*)memory;
ptr->~Base();
这里的对象是Derived 类型,而“析构函数的类类型”是Base,所以根据标准的措辞,UB 是没有根据的。
那么上面的代码是否根据标准产生了 UB?
【问题讨论】:
-
派生通常会提供一些成员吗?
-
@itwasntpete:嗯,不一定。例如,您可以制作一个新的异常类,无需添加任何新成员即可单独捕获。
-
我有一种预感,这是 UB,因为 12.4/12 允许使用
derivedPtr->~Base()形式以支持虚拟析构函数。不过,这里没有可用的 C++03。
标签: c++ destructor undefined-behavior