如题,此部分为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问题。。。