map/set iterator not dereferencable问题

如题,此部分为map循环过程中出现的bug,但是有时候会出现,有时候就不出现。调试后发现出现野指针情况(很奇怪。。。按道理每次的end终止都应该有这个问题的啊)

代码附上:
(代码功能:一个map容器的循环内部嵌套局部while循环,而while循环时也会进行i++,使用insert插入另一map)
(野指针问题:i++后指针指向无效元素位置,故不能获取first,second)


for (auto& i = ParsePackage::GetInstence()->packetData.begin();
			i != ParsePackage::GetInstence()->packetData.end(); i++)
{
	... ...
	while (tmpPkgData.GetLength() < ContentLen)
	{
		i++;
		tmpPkgData += i->second;//问题行
		if (tmpPkgData.GetLength() > ContentLen)
		{
			tmpPkgData = tmpPkgData.Left(ContentLen);
		}
	}
	SoapStr.insert({ i->first, tmpPkgData });//问题行
	... ...
}

解决:在while局部循环中也会使循环i++,但并没有end终止判断;
加入判断后,仍有i++,所以再加入标志位。

bool flag = false;//加入标志位
for (auto& i = ParsePackage::GetInstence()->packetData.begin();
			i != ParsePackage::GetInstence()->packetData.end(); i++)
{
	... ...
	while (tmpPkgData.GetLength() < ContentLen)
	{
		i++;
		if (i != ParsePackage::GetInstence()->packetData.end())//end终止判断
		{
			flag = false;
			tmpPkgData += i->second;
			if (tmpPkgData.GetLength() > ContentLen)
			{
				tmpPkgData = tmpPkgData.Left(ContentLen);
			}
		}
		else
		{
			flag = true;
			break;
		}
	}
	SoapStr.insert({ (flag ? --i : i)->first, tmpPkgData });//在标志位变化为true则自减至有效元素再插入此map
	... ...
}

调试中发现:在修改end判断位置不当且无标志位时也会出现map/set iterator not incrementable问题。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值