我在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;
}

10-08 17:06