在类内部初始化数组会产生std :: bad_alloc错误,但外部没有错误?

时间:2018-04-26 17:53:48

标签: c++ arrays memory-management bad-alloc

我有一个包含两个类的程序(我称之为Master和Slave),Slave继承自Master。在Slave中,我定义了一个struct,以及这个struct类型的可能值数组。然后使用数组索引实例化Slave,该数组的值要从Master类填充变量。

像这样:

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 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个字节,它应该几乎不会在栈中产生影响,而我只是实例化了一次类。尝试调试它,但是在踩到Slave构造函数之后,它进入了一个C ++本机函数的深洞,这是我无法理解的,很快就会抛出bad_alloc错误。

UPDATE :根据评论中的要求,类会被实例化:

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

平台:Windows 10,MSVC 2017。

1 个答案:

答案 0 :(得分:2)

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

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

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