我在std::vector的擦除功能中出现分段错误,这使我发疯。有以下代码:
std::map<uint32_t, std::vector<boost::uuids::uuid> >::iterator it
= theAs.find(lSomeUint32);
if (it != theAs.end()) {
std::vector<boost::uuids::uuid>& lIds = it->second; // vector contains one entry
std::vector<boost::uuids::uuid>::iterator it2 = lIds.begin();
while (it2 != lIds.end()) {
if (*it2 == lSomeUuid) {
lIds.erase(it2);
break;
}
++it2;
}
}
在lIds.erase(it2)中,我遇到了分段错误。更准确地说,我在_Orphan_range(可在c:\ Program Files \ Microsoft Visual Studio 10.0 \ VC \ include \ vector中找到)中出现分段错误,该错误是从擦除中调用的。但是我不知道为什么。 vector 和迭代器看起来不错。但是在_Orphan_range中,有些事情完全出错了。尽管我的 vector 仅包含一项,但while循环执行了3次。在第三次运行中,变量_Pnext被破坏。
有人有主意吗?那将是真棒!
大卫
不幸的是(或者幸运的是),上面的示例执行了独立的工作。但是在我的大型软件项目中,它不起作用。
有人知道失败的函数_Orphan_range被执行什么吗?
最佳答案
从std::vector擦除会使迭代器无效。见STL vector::erase
因此,在第一次调用擦除后,it2无效。 las,检查“(it2!= lIds.end())”将不成立。
将您的代码更改为:
if (*it2 == lSomeUuid) {
it2 = lIds.erase(it2);
break;
}