vector.push_back()崩溃了

时间:2012-03-21 12:25:31

标签: c++ vector

使用类的向量时遇到问题。我已经尝试尽可能地减少代码,让我得到下面的代码。然而,在这样做之后,我仍然无法弄清楚为什么我的程序崩溃了。我来自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 个答案:

答案 0 :(得分:16)

你是对的,有不确定的行为。

您正在参考BreakIt.at(0);但是,在完成push_back之后,不再保证此对象存在,因为如果向量增长,则通常会复制所有内容,并删除原始文件。

来自http://www.cplusplus.com/reference/stl/vector/push_back/(不是世界上最好的参考):

  

重新分配使以前获得的所有迭代器,引用和指针无效。

答案 1 :(得分:0)

对我来说,这是MinGW版本(MinGW g ++ 6.3.0)的问题,我从https://mingw-w64.org/doku.php/download更新到7.2.0。
现在它工作正常。