两段相似C++代码一正常一崩溃,原因何在?
问题排查与解决
嘿,我一眼就揪出了导致第一段程序崩溃的元凶——这是个很容易犯的低级笔误,再加上全局变量的特性,直接触发了非法内存访问。咱们一步步说清楚:
1. 致命的笔误:把赋值写成了相等判断
看第一段代码里的for循环:
for(dit1==f.back().begin();dit1!=f.back().end();dit1++)
这里的初始化部分你写的是 dit1==f.back().begin() —— 这是相等比较操作,不是给dit1赋值啊!
这就导致dit1这个迭代器变量完全是未初始化的状态,它指向的是随机的垃圾内存地址。当你试图用这个野迭代器去遍历f.back()时,程序必然会访问非法内存,直接崩溃。
而你的第二段测试代码里,for循环的初始化是正确的赋值:
for(it=vd.back().begin();it!=vd.back().end();it++)
这就是两段代码行为天差地别的核心原因。
2. 全局变量的小影响(非崩溃主因)
虽然全局变量f不是崩溃的直接原因,但得提一嘴:全局变量会在程序启动时就被默认初始化(这里vector<deque<uint32_t>> f会变成空vector),而局部变量是进入函数时才初始化。不过哪怕f是全局的,只要你把for循环的==改成=,程序就能正常跑起来——不信你试试!
修复后的代码示例
只需要把for循环里的==改成=就行:
#include <iostream> #include <vector> #include <deque> using namespace std; vector<deque<uint32_t>> f; int main() { deque<uint32_t> p; deque<uint32_t>::iterator dit1,dit2; p.push_back(0); p.push_back(1); f.push_back(p); cout << f.back().size() << endl; cout << "f= "; // 把 == 替换成 = for(dit1 = f.back().begin(); dit1 != f.back().end(); dit1++) cout << *dit1 << " "; cout << "Checkpoint" << endl; return 0; }
额外小建议
- 尽量少用全局变量,它会让程序逻辑变复杂,调试起来更麻烦,像第二段代码用局部变量的方式更值得推荐。
- 写循环时多留意初始化语句,这类笔误太常见,但后果真的很头疼。
- 如果你的编译器支持C++11及以上,建议用范围for循环,能彻底避免这类迭代器初始化的错误:
for (auto num : f.back()) { cout << num << " "; }
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

