vector.push_back () вылетает - PullRequest
       10

vector.push_back () вылетает

5 голосов
/ 21 марта 2012

У меня проблема при работе с векторами класса.Я старался максимально сократить количество кода, оставив мне код ниже.Тем не менее, после этого я все еще не могу понять, почему моя программа падает.Я из мира VBA, и мои навыки отладки в C ++, по меньшей мере, плохие, и я прошу прощения за это заранее.Любое руководство по улучшению моих способностей здесь будет с радостью принято.

Мой класс:

class Tester {
public:

    int varA;
    int varB;

    Tester() {
        varA = 1;
        varB = 1;
    }

    Tester(Tester& P1, Tester& P2) {
        varA = P1.varA + P2.varA;
        varB = P1.varB + P2.varB;
    }

    Tester(const Tester &Source) {
        varA = Source.varA;
        varB = Source.varB;
    }

};

Моя тестовая сеть:
Не работает:

int main() {
std::vector < Tester > BreakIt;

    for (int i = 0; i < 2500; i++) {
        Tester newTester;
        BreakIt.push_back(newTester);
        Tester& tempTester = BreakIt.at(0);
        for (int j = 0; j < 4; j++) {
            BreakIt.push_back(Tester(newTester, tempTester)); //This is where it crashes.
        }
    }

return 0;
}

Работает:

int main() {
std::vector < Tester > BreakIt;

    Tester newTester;
    BreakIt.push_back(newTester);

    for (int i = 0; i < 2500; i++) {
        Tester& tempTester = BreakIt.at(0);
        for (int j = 0; j < 4; j++) {
            BreakIt.push_back(Tester(newTester, tempTester));
        }
    }

return 0;
}

Работает:

int main() {
std::vector < Tester > BreakIt;

    for (int i = 0; i < 2500; i++) {
        Tester newTester;
        BreakIt.push_back(newTester);
        Tester& tempTester = BreakIt.at(0);
    }

return 0;
}

Разрыв строки push_back()запустить несколько раз до аварии.Кажется, что когда я изменяю некоторые вещи вокруг и перекомпилирую, меняется точка, в которой происходит сбой (т.е. 20 раз в основном цикле против 175 раз против 1000 раз).Однако, после того как я скомпилирован, он обычно проходит одну и ту же итерацию каждый раз перед сбоем.

Я подозреваю, что это какое-то «неопределенное поведение», но откуда я не уверен.

Может кто-нибудь помочь мне определить, почему BreakIt.push_back(Tester(newTester, tempTester)); не работает там, где я хочу?

Ответы [ 2 ]

16 голосов
/ 21 марта 2012

Вы правы, поведение неопределено.

Вы ссылаетесь на BreakIt.at(0);однако этот объект больше не гарантированно существует после того, как вы сделали push_back, потому что если вектор увеличивается, все содержимое обычно копируется, а оригиналы удаляются.

Из http://www.cplusplus.com/reference/stl/vector/push_back/ (не самая лучшая ссылка в мире):

Перераспределение делает недействительными все ранее полученные итераторы, ссылки и указатели.

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

Для меня это была проблема с версией MinGW (MinGW g ++ 6.3.0), которую я обновил до 7.2.0 с https://mingw -w64.org / doku.php / download .
Теперь работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...