使用非虚拟析构函数的未定义行为 - 这是一个现实问题吗?

Rod*_*ddy 4 c++ destructor undefined-behavior

请考虑以下代码:

class A 
{
public:
  A() {}
  ~A() {}
};

class B: public A
{
  B() {}
  ~B() {}
};

A* b = new B;
delete b; // undefined behaviour
Run Code Online (Sandbox Code Playgroud)

我的理解是C++标准说删除b是未定义的行为 - 即,任何事情都可能发生.但是,在现实世界中,我的经验是始终调用~A(),并正确释放内存.

如果B引入任何具有自己的析构函数的类成员,它们将不会被调用,但我只对上面的简单案例感兴趣,其中使用继承可能修复一个类方法中的错误,源代码是不可用.

显然,这不是你想要的非平凡情况,但它至少是一致的.对于显示的代码,您是否了解上述情况未发生的任何 C++实现?

Han*_*ant 6

这是C++标签中一个永无止境的问题:"什么是可预测的未定义行为".易于自行解决:获取每个 C++编译器实现并检查可预测的不可预测性是否仍然有效.然而,这是你必须自己做的事情.

回发你发现的内容,知道这些内容非常有用.只要不可预测的内容具有一致且注释的行为.这使得编写C++编译器的人很难让任何人关注他的产品.按惯例标准化,使用具有大量未定义行为的语言会发生很多.