通过指向其基的指针删除 POD 对象是否安全

Is it safe to delete a POD object by a pointer to its base?

本文关键字:POD 删除 对象 是否 安全 指针      更新时间:2023-10-16

实际上,我正在考虑琐碎的可破坏对象,而不仅仅是POD(我不确定POD是否可以具有基类)。

当我从 cpppreferences 中阅读此解释以获取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()肯定是微不足道的。

我知道这段代码

闻起来很臭,但我的问题只是关于这段代码的安全性......

不,这是不允许的。[expr.delete]/p3,强调我的:

在第一个备选方案(删除对象)中,如果静态类型 要删除的对象不同于其动态类型,即静态 类型应是要成为的对象的动态类型的基类 已删除,静态类型应具有虚拟析构函数或 行为未定义。

事实上,委员会最近拒绝了一项提案,即通过明确定义的指针到基地删除 POD。