vector.push_back()崩溃了

Gaf*_*ffi 7 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;
    }

};
Run Code Online (Sandbox Code Playgroud)

我的测试电源:
不工作:

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;
}
Run Code Online (Sandbox Code Playgroud)

工作:

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;
}
Run Code Online (Sandbox Code Playgroud)

工作:

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;
}
Run Code Online (Sandbox Code Playgroud)

push_back()打破行确实在飞机坠毁前跑几次.似乎当我改变某些事物并重新编译时,它崩溃的点会发生变化(即主循环的20次与175次的1000次相比).但是,一旦我编译完成,它通常会在每次崩溃之前运行相同的迭代.

我怀疑这是某种"未定义的行为",但我不确定.

有人可以帮我确定为什么BreakIt.push_back(Tester(newTester, tempTester));不能在我想要的地方工作?

Oli*_*rth 17

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

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

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

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