从向量c++中擦除对象时出现分段错误

segmentation fault when erasing an object from a vector c++

本文关键字:分段 错误 对象 向量 c++ 擦除      更新时间:2023-10-16

所以当我运行这个函数时,我出现了seg错误

      class vector <Record<value> >::iterator itr = records.begin();
      for (; itr != records.end(); ++itr) {
        if (itr->isSelected()) {
          itr = records.erase(itr);
          recordSize--;
        }
      }

其中我的向量是CCD_ 1,函数CCD_。

有人能帮我吗,我认为这样做没有问题

在删除最后一个元素的情况下,itr将首先是records.end(),因为这是records.erase()将返回的内容,然后用++itr递增。尝试:

  while (itr != records.end()) {
    if (itr->isSelected()) {
      itr = records.erase(itr);
      recordSize--;
    } else {
      ++itr;
    }
  }

您不应该像那样擦除矢量元素,这不是一种有效的方法,因为在这个过程中可能会导致多次重新分配矢量。

正确且更有效的方法是使用std::erase函数。请参阅此问题以获取示例。

for (; itr != records.end(); ++itr)保证在循环体中未修改itr或CCD_9递减时不会转义容器并调用UB。

在这里,您正在推进迭代器:vector <Record <value> > records;0。

当你这样做时,你不仅跳过了一个元素,你还可以跳过一个超过末尾的假想"元素",IOW你可以增量超过一个超过结尾(UB(。