C++ VC++;多态阵列

C++ VC++;多态阵列,c++,arrays,polymorphism,C++,Arrays,Polymorphism,我发现这样的代码 #include <iostream> class A { public: A() { std::cout << "cA" << std::endl; } virtual ~A() { std::cout << "dA" << std::endl; } char a[11]; }; class B : public A { pub

我发现这样的代码

#include <iostream>

class A
{
public:
    A()
    {
        std::cout << "cA" << std::endl;
    }
    virtual ~A()
    {
        std::cout << "dA" << std::endl;
    }
    char a[11];
};
class B : public A
{
public:
    B()
    {
        std::cout << "cB" << std::endl;
    }
    ~B()
    {
        std::cout << "dB" << std::endl;
    }
    char a[21];
};
int main()
{
    {
        A* aa  = new B[5];
        std::cout << "==============" << std::endl;
        delete[] aa;
    }
    return 0;
}
#包括
甲级
{
公众:
()
{

std::cout在gcc情况下实际会发生什么?如果未定义,则为未定义行为。至少如果我正确理解此cppreference条目。我遇到分段错误。您可以在这里看到您正在调用未定义行为。在第二个备选方案(删除数组)中,按照
[expr.delete]
§5.3.5/3“如果要删除的对象的动态类型与其静态类型不同,则行为未定义。“指针的静态类型为
A
,动态对象的静态类型为
B
。这不同于非数组
delete
运算符,在该运算符中,连接虚拟析构函数变得相关,但仍然受支持。要迭代数组(请参阅
向量删除析构函数
),并调用正确的析构函数,编译器需要知道实际对象的大小。在上述情况下,这可以在编译时找到。我个人更喜欢VC的行为:它符合预期。