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

时间:2011-10-01 02:08:03

标签: c++ segmentation-fault

所以当我运行这个函数时,我就是错误的

      class vector <Record<value> >::iterator itr = records.begin();

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

我的向量是vector <Record <value> > records;,而函数isSelected()只是boolean,当选择对象时为true,否则为{0}。

有人可以帮助我吗,我没有看到这样做的问题

3 个答案:

答案 0 :(得分:5)

如果您要删除最后一个元素,itr将首先为records.end(),因为records.erase()将返回该内容,然后您使用{{1}将其递增}}。尝试:

++itr

答案 1 :(得分:1)

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

正确且更有效的方法是使用std :: erase函数。请参阅this question for examples

答案 2 :(得分:1)

保证

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

在这里你推进了迭代器:itr = records.erase(itr);

当你这样做时,不仅你跳过一个元素,你也可以跳过一个过去想象的“元素”,如果你增加超过一个结束的 strong>(UB)。