【发布时间】:2017-02-23 12:50:34
【问题描述】:
给定以下代码:
struct Bar {
Bar() { }
~Bar() { }
};
struct FooBase {
// No virtual destructor
};
struct Foo : FooBase {
Foo() : bar{} { }
union {
Bar bar;
};
};
int main() {
FooBase *p = new Foo;
static_cast<Foo *>(p)->bar.~Bar();
delete p;
}
我希望将Foo::bar 的生命周期与其封闭的Foo 分离。
据我所知,delete p; 是明确定义的当且仅当Foo 的析构函数是微不足道的。
由于Foo 仅包含一个联合,并且不应该破坏其bar 本身,因此看起来就是这样:通俗地说,该析构函数什么都不做。
但是这段代码真的是按照标准定义好的吗?
【问题讨论】:
-
1.) 只有一个成员变量的未命名联合是奇怪的。 2.) 如果您不确定,那么很可能是 UB。我会质疑你的假设,即
delete p在这里定义良好。 -
@knivil 我am质疑它是否定义明确;)
-
啊,,,我虽然你问其他奇怪的事情,如
Foos 析构函数或分配给基类指针而不是多态的。
标签: c++ language-lawyer undefined-behavior unions