在 class 内初始化数组会出现 std::bad_alloc 错误,但在外部不会?

Initializing array inside class gives std::bad_alloc error, but outside doesn't?

我有一个程序有两个 classes(我称它们为 Master 和 Slave),Slave 继承自 Master。在 Slave 中,我定义了一个结构,以及这个结构类型的可能值数组。然后用数组的索引实例化从站,我想从主站 class.

填充其值的变量

像这样:

class Master
{
public:
    std::string _a;
    char _b;
    int _c;
    int _d;
    int _e;

    Master(std::string a, char b, int c, int d, int e)
        : _a {a}, _b {b}, _c {c}, _d {d}, _e {e} {}
};

class Slave : public Master
{
public:
    struct SlaveStruct
    {
        std::string a;
        char b;
        int c;
        int d;
        int e;
    };

    const SlaveStruct slaveArray[3]
    {
        {"name_a", 'A', 1, 2, 3},
        {"name_b", 'B', 4, 5, 6},
        {"name_c", 'C', 7, 8, 9}
    };

    Slave(int index) : Master {slaveArray[index].a, slaveArray[index].b, 
        slaveArray[index].c, slaveArray[index].d, slaveArray[index].e} {}
};

但是,当我尝试实例化它时,会出现 std::bad_alloc 错误。弄乱了,我发现它工作得很好,但是如果我只是在 class 内声明数组并在外部初始化它,就像这样:

class Slave : public Master
{
    //(...)

    static SlaveStruct slaveArray[3];

    //(...)
};

Slave::SlaveStruct Slave::slaveArray[3]
{
    {"name_a", 'A', 1, 2, 3},
    {"name_b", 'B', 4, 5, 6},
    {"name_c", 'C', 7, 8, 9}
};

然而,这是为什么呢?这个数组的大小为 144 字节,它应该几乎不会在堆栈中产生任何影响,而且我只实例化 class 一次。尝试调试它,但在进入从属构造函数后,它进入了我无法理解的 C++ 本机函数的深渊,很快就会抛出 bad_alloc 错误。

UPDATE:根据评论中的要求,class 实例化如下:

int main()
{
    Slave slave {1}; // For example, any index will throw the same error.
}

平台:Windows10,MSVC 2017。

首先调用基础 class 构造函数,然后构造成员。

Master {slaveArray[index].a,...} 中,您试图将 slaveArray[index].a 传递给基础 class' 构造函数,但此时 slaveArray 尚未初始化。因此,您的程序表现出未定义的行为。

相比之下,静态成员在程序启动时初始化,在输入 main 之前。这就是为什么你的第二个例子工作正常。