访问迭代器值会导致segfault 11

时间:2015-05-20 08:00:36

标签: c++

我有一个循环删除邻接列表中的Graph边缘。它看起来像这样:

void Graph::removeEdge(int a, int b)
{
  vector<int>::iterator it = adjList[a].begin();
  while(*it != b) it++;
  adjList[a].erase(it);

  it = adjList[b].begin();
  while(*it != a) it++;
  adjList[b].erase(it);
}

几次尝试后,我收到Segmentation fault: 11错误。这是由访问*it引起的。可能是什么原因,如何解决这个问题?

更多信息:

// This is my structure
vector<int> *adjList;


Graph::Graph(int V)
{
  this->V = V;
  adjList = new vector<int>[V];
  clear();
}

1 个答案:

答案 0 :(得分:4)

这里可能发生的事情是: 1.陷入无限循环(在你的情况下:段错误) 2.擦除不存在的迭代器(segfault)。

要纠正这些,请注意:

而不是:

  while(*it != b) it++;
  adjList[a].erase(it);

做的:

  while(it != adjList[a].end() && *it != b) it++;
  if (it != adjList[a].end()) adjList[a].erase(it);

如果在到达b时未找到元素end,则结束循环,if子句将确保删除现有的迭代器。