C++|迭代器失效问题
迭代器指针失效的两种情况:
案例一(insert):
情况一:意义变了
在Linux环境下:
示例:
文章图片
文章图片
在vs2019环境下:
文章图片
文章图片
可以看到pos是在插入30之前给的值,插入后,可以认为pos就失效了,
在vs2019环境下,插入后pos的意义变了,pos指向的是30,不再是3,导致erase(pos)没有达到删除3的目的,程序崩溃
而在Linux环境下,“正常运行”,因为不同库的所执行的标准不同,检查机制也不一样,vs检查比Linux严格
情况二:野指针
文章图片
只讲程序又插入了一个数据6,程序也崩了,但这原理跟情况一不同
文章图片
插入6后,程序进行了增容:
重新开辟了一个capacity=9(vs1.5倍增容)的空间,而pos还指向的是原来空间的地址,该空间已经释放,就出现野指针的问题
所以pos在Insert后就失效了,尽量不要使用它
解决方法:
其实很简单,根本问题就是pos指向了错误的空间,只需再次查找pos的空间即可
文章图片
文章图片
案例二(erase): 插入12345删除其中的偶数,下面代码有什么问题?
#include
#include
using namespace std;
int main()
{ vector v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
vector::iterator it = v.begin();
while (it != v.end())
{if (*it % 2 == 0)
{v.erase(it);
}
++it;
}
for (auto e : v)
{cout << e << " ";
}
cout << endl;
return 0;
}
在Linux环境下:
文章图片
看似运行结果正常
但我们在后面再加入一个偶数6呢?
文章图片
出现段错误
那这是为什么呢?
文章图片
可以看到在一次it=2的循环后,直接跳过了it=3,到了it=4
所以在it=6时
文章图片
出现it与end错开的情况,之后it越界一直往后走,所以段错误
在VS2019下无论末尾是基数还是偶数都会报错,因为VS下erase后vs对++做了检查
解决方法:
只需改动一下while循环
文章图片
文章图片
erase会返回删除后的下一个位置
所以该程序程序存在潜在问题,侧面说明vs的检测比linux更严格
insert和erase都会使迭代器失效:
1.insert或erase后迭代器意义变了
2.insert或erase后it成为野指针 (增/缩容)
【C++|迭代器失效问题】所以迭代器失效的根本问题就是指向了错误的空间,解决就将它指向正确的空间即可
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- 人生感悟记#环境仪器宋庆国成长记#072
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- opencv|opencv C++模板匹配的简单实现
- 视频转换器哪种好用()
- NeuVector 会是下一个爆款云原生安全神器吗()
- 操作系统|[译]从内部了解现代浏览器(1)
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 探索免费开源服务器tomcat的魅力
- 机器学习|机器学习 Andrew Ng《Machine Learning》课程笔记1