Инициализация массива внутри класса дает ошибку std :: bad_alloc, но снаружи нет? - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть программа с двумя классами (я буду называть их Master и Slave), с Slave, наследующим от Master. В Slave я определил структуру и массив возможных значений этого типа структуры. Затем Slave создается с индексом массива, значения которого я хочу заполнить переменными из мастер-класса.

Вроде так:

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.

ОБНОВЛЕНИЕ : В соответствии с запросом в комментариях класс создается следующим образом:

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

Платформы: Windows 10, MSVC 2017.

1 Ответ

0 голосов
/ 26 апреля 2018

Сначала вызывается конструктор базового класса, затем создаются члены.

В Master {slaveArray[index].a,...} вы пытаетесь передать slaveArray[index].a в конструктор базового класса, но на данный момент slaveArray еще не инициализирован. Поэтому ваша программа демонстрирует неопределенное поведение.

Напротив, статический элемент инициализируется при запуске программы до ввода main. Вот почему ваш второй пример работает нормально.

...