* итератор вызывает segfault - PullRequest
       21

* итератор вызывает segfault

3 голосов
/ 03 апреля 2011

Я пытаюсь пройтись по списку.Вот некоторые объявления:

list<CG1_Edge*> ActiveEdges;
list<CG1_Edge*>::iterator ActiveEdgeIterator;

Иногда этот код вызывает ошибки в строке 2:

for (this->ActiveEdgeIterator = this->ActiveEdges.begin(); this->ActiveEdgeIterator != this->ActiveEdges.end(); ++this->ActiveEdgeIterator) {
    CG1_Edge* currentEdge = *this->ActiveEdgeIterator;
    if (currentEdge->y_up < y)
        this->ActiveEdges.erase(this->ActiveEdgeIterator);
}

Существуют ли общие причины, по которым это может привести к ошибке segfault?

Ответы [ 2 ]

5 голосов
/ 03 апреля 2011

Вы должны использовать что-то вроде:

for (this->ActiveEdgeIterator = this->ActiveEdges.begin(); this->ActiveEdgeIterator != this->ActiveEdges.end(); ) {
    CG1_Edge* currentEdge = *this->ActiveEdgeIterator;
    if (currentEdge->y_up < y)
        this->ActiveEdgeIterator = this->ActiveEdges.erase(this->ActiveEdgeIterator);
    else
        ++this->ActiveEdgeIterator;
}

, поскольку erase возвращает итератор, расположенный на следующем элементе.

(Примечание: наличие этого итератора в качестве члена выглядит странно.)

0 голосов
/ 03 апреля 2011

Комментарий Бегемота должен быть принятым ответом. В соответствии со стандартным стиранием делает недействительными «все итераторы и ссылки на элементы после позиции» ( моя ошибка; это было для вектора и, возможно, других контейнеров; поэтому, по крайней мере, чтобы избежать неожиданностей, вы должны преуспеть в использовании версия алгоритма вместо ).

Так что вам будет безопаснее использовать rbegin () и rend (). Но почему бы не использовать std :: alogirthms!

struct Predicate 
{
     int _y;
     explicit Predicate(int y) : _y(y) {}

     bool operator()(const CG1_Edge edge) const
     {
          return currentEdge->y_up < _y;
     }
};

std::erase(
     std::remove_if(this->ActiveEdges.begin(), this->ActiveEdges.end(), Predicate(y)),
     this->ActiveEdges.end());
...