在std :: list上使用erase时的C分段

前端之家收集整理的这篇文章主要介绍了在std :: list上使用erase时的C分段前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用erase和列表迭代器从C链接列表中删除项目:
#include <iostream>
#include <string>
#include <list>

class Item
{
  public:
    Item() {}
    ~Item() {}
};

typedef std::list<Item> list_item_t;


int main(int argc,const char *argv[])
{

  // create a list and add items
  list_item_t newlist;
  for ( int i = 0 ; i < 10 ; ++i )
  {
    Item temp;
    newlist.push_back(temp);
    std::cout << "added item #" << i << std::endl;
  }

  // delete some items
  int count = 0;
  list_item_t::iterator it;

  for ( it = newlist.begin(); count < 5 ; ++it )
  {
    std::cout << "round #" << count << std::endl;
    newlist.erase( it );
    ++count;
  }
  return 0;
}

我得到这个输出,似乎无法追查原因:

added item #0
added item #1
added item #2
added item #3
added item #4
added item #5
added item #6
added item #7
added item #8
added item #9
round #0
round #1
Segmentation fault

我可能做错了,但无论如何都会很感激.谢谢.

解决方法

这里的核心问题是你在迭代器值上使用它,在你调用擦除之后.擦除方法使迭代器无效,因此继续使用它会导致不良行为.相反,您希望使用erase的返回来获取擦除值之后的下一个有效迭代器.
it = newList.begin();
for (int i = 0; i < 5; i++) {
  it = newList.erase(it);
}

包含对newList.end()的检查以考虑列表中不存在至少5个元素的情况也没有什么坏处.

it = newList.begin();
for (int i = 0; i < 5 && it != newList.end(); i++) {
  it = newList.erase(it);
}

正如Tim所指出的,这里有一个很好的擦除参考

> http://www.cplusplus.com/reference/stl/list/erase/

猜你在找的C&C++相关文章