【问题标题】:segmentation fault when erasing an object from a vector c++从向量c ++中擦除对象时出现分段错误
【发布时间】:2011-10-01 02:08:03
【问题描述】:

所以我在运行这个函数时出现了段错误

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

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

我的向量是vector &lt;Record &lt;value&gt; &gt; records;,而函数isSelected() 只是一个boolean,当对象被选中时为真,否则为假。

谁能帮帮我,我不认为这样做有问题

【问题讨论】:

    标签: c++ segmentation-fault


    【解决方案1】:

    如果您要删除最后一个元素,itr 将首先是 records.end(),因为这是 records.erase() 将返回的内容,然后您将使用 ++itr 递增它。试试:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        如果itr 在循环体中没有被修改,或者如果它被递减,for (; itr != records.end(); ++itr) 保证不会转义容器并调用 UB。

        您正在推进迭代器:itr = records.erase(itr);

        当你这样做时,你不仅会跳过一个元素,而且你可能会跳过一个过去的假想“元素”,IOW 你可以增加过去一个过去的元素强>(UB)。

        【讨论】:

          猜你喜欢
          • 2017-05-22
          • 2018-08-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-03
          相关资源
          最近更新 更多