c++ - 普通C++代码导致结果不确定
问题描述
我有这样的代码:
vector<int> v = {1,-2,-2,3};
int gsum = 0; //global sum
for(auto i=v.begin(); i!=v.end(); ){
if(*i >= 0){
gsum += *i;
v.erase(i,i+1);
}else{
v.insert(i, gsum);
gsum = 0;
i+=2;
}
}for (auto i : v) {
cout<<i<<ends;
}
运行它,发现有时它永远不会结束,有时它会打印极大或极小的数字,有时它会抛出“heap-buffer-overflow”。谁能解释一下?
解决方案
该v.erase(i,i+1)
行使所有迭代器无效v
-包括您的for
循环用于迭代容器的那些。因此,在该行之后,您的循环使用了无效的迭代器,并且您的代码具有未定义的行为。
推荐阅读
- ruby-on-rails - Ruby 的 mysql2 gem 使用了不正确的数据库包(MariaDB 而不是 MySQL)
- c++ - 将 gtkmm4 FileChooserNative 的 signal_response 连接到函数时生成错误
- css - Bootstrap 4 卡在多行上响应相同的高度
- reactjs - 将 reactjs 应用程序部署到 github 页面后得到一个空白页面
- c++ - Destructor crashes when working with pointers in Visual Studio
- python - Sqlite3 关系数据库
- pandas - 如何在 str 列 pandas 数据框中放置一个掩码?
- javascript - Javascript仅检查数组的第一项
- goland - 升级到 Goland 2021.2 “未发现问题”大量 RED 文件
- python - selenium 无法将键发送到输入框