我在使用类的向量时遇到问题.我已经尝试尽可能地减少代码,让我得到下面的代码.然而,在这样做之后,我仍然无法弄清楚为什么我的程序崩溃了.我来自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/(不是世界上最好的参考):
重新分配使以前获得的所有迭代器,引用和指针无效.
| 归档时间: |
|
| 查看次数: |
8039 次 |
| 最近记录: |