栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

迭代器失效问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

迭代器失效问题

迭代器指针失效的两种情况: 案例一(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成为野指针 (增/缩容)

所以迭代器失效的根本问题就是指向了错误的空间,解决就将它指向正确的空间即可

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/302693.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号