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