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

Pio*_*ycz 11 c++ destructor pod c++11

实际上我正在考虑简单的可破坏的对象,不仅仅是关于POD(我不确定POD可以有基类).

当我从cppreference中读到is_trivially_destructible的这个解释时,我注意到这一点:

由简单可破坏的对象占用的存储可以在不调用析构函数的情况下重用.

所以,这样做是安全的:

struct A {
  int a;
};
struct B : A {
  int b;
};
int main() {
  A* a = new B;
  delete a;
}
Run Code Online (Sandbox Code Playgroud)

B::~B()将不会被调用 - 和AFAIK(如果我错了请更正)整个内存将被释放.而且B::~B()肯定是微不足道的.

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

T.C*_*.C. 18

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

在第一个备选(删除对象)中,如果要删除的对象的静态类型与其动态类型不同,则静态类型应为要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.

事实上,该委员会最近拒绝 了一项建议,即通过明确定义的指针来删除POD.

  • 或许值得一提的是,显式调用`:: operator delete(a)`是否是一种有效的解决方法.据我所知,这是有效的.但是,我不推荐它,如果有可能`删除a;`实际上会调用另一个`operator delete`. (2认同)