删除指向类型B指针的A类指针

1 c++ pointers delete-operator

假设我有ABC*类型的指针和另一个XYZ*类型的指针,它们都来自一个公共父类.

如果我通过显式地将XYZ*分配给ABC*,那么如果我打电话会发生什么

删除abc; // abc的类型为XYZ*

我会得到任何例外或它会正常工作吗?

我已经尝试了上面的代码,它不会崩溃.那么有谁能告诉我在什么情况下会删除抛出异常/故障/崩溃等?

delet'ing指针崩溃程序的情况是什么?如果它们都定义了自定义析构函数,它们会崩溃吗?

编辑:这是我的测试代码,没有任何崩溃

class ABC
{
public:
    int a;
    int b;
    int c;
};

class XYZ
{
public:
    double a;
    double b;
    double c;
};

int main()
{
    ABC* abc = new ABC();
    XYZ* xyz = (XYZ*)abc;

    delete xyz;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

PS:我在Windows平台上,如果有帮助的话.

EDIT2:好的,所以在阅读之后,我将问题改为,何时删除指针会导致崩溃(不包括未定义的行为)?

编辑3:调用删除时会发生什么?会叫谁的析构函数?

Wil*_*l A 5

如果XYZ不是从ABC派生的,那么你不应该将前者的对象投射到后者 - 无论你的删除是否有效都是无关紧要的.


CB *_*ley 5

这是非法的.如果要在非数组删除表达式中删除的指针类型与要删除的对象的动态类型不同,则指向对象的类型必须是要删除的对象的基类,并且基类必须具有一个虚拟的析构函数.

见ISO/IEC 14882:2003 5.3.5 [expr.delete]/2.