访问迭代器值会导致segfault 11

Accessing iterator value causes segfault 11

本文关键字:segfault 迭代器 访问      更新时间:2023-10-16

我有一个循环,可在邻接列表中删除图形边缘。看起来这样:

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.卡在无限环路中,(在您的情况下:segfault)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);

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