2015-05-20 5 views
0

У меня есть цикл, который удаляет графы Графа в списке смежности. Это выглядит следующим образом:Доступ к значению итератора вызывает segfault 11

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(); 
} 
+2

Вы не проверяете, указывает ли итератор на 'adjList.end()', поэтому это может быть причиной segfault. – EdChum

+1

Предположительно, один из векторов не содержит элемент, который вы ищете, поэтому вы итерация прошла мимо конца. Вам будет лучше использовать 'std :: find'. – TartanLlama

+0

Являются ли индексы 'a' и' b' действительными в 'adjList'? –

ответ

4

Вещи, которые могут произойти здесь: 1. Застрял в бесконечном цикле и (в вашем случае: выдаёт ошибку сегментации) 2. Стирание не существующий итератора (выдаёт ошибку сегментации).

Чтобы исправить это, есть это:

Вместо:

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 убедитесь, что вы удалили существующий итератор.

+2

Я не думаю, что это важно в этом случае. OP только удаляет первое вхождение. Проблема заключается в стирании конечного итератора, как упоминалось в комментариях. – juanchopanza

+0

Пила тоже, спасибо. Исправлен ответ – Nidhoegger

+0

Собственно, хорошо поймать бесконечный цикл. – juanchopanza

Смежные вопросы