实际上我正在考虑简单的可破坏对象,而不仅仅是关于POD(我不确定POD可以有基类)。
当我从cppreference中读到is_trivially_destructible的这个解释时,我注意到了这一点:
可以在不调用析构函数的情况下重复使用由可轻易破坏的对象占用的存储空间。
所以,这样做是安全的:
struct A {
int a;
};
struct B : A {
int b;
};
int main() {
A* a = new B;
delete a;
}
B::~B()
不会被叫 - 而AFAIK(请纠正,如果我错了)整个记忆将被释放。 B::~B()
肯定是微不足道的。
我知道这段代码闻起来很糟糕,但我的问题只是关于这段代码的安全性......
答案 0 :(得分:18)
不,这是不允许的。 [expr.delete] / p3,强调我的:
在第一个备选方案(删除对象)中,如果是静态类型的话 要删除的对象不同于其动态类型,静态 type应该是对象的动态类型的基类 删除并且静态类型应具有虚拟析构函数或 行为未定义。
事实上,委员会最近才rejected a proposal to make deleting a POD via a pointer-to-base well-defined。