векторный итератор не может быть разыменован во время выполнения для вектора <vector <vector <A *> *> *> - PullRequest
0 голосов
/ 07 мая 2010

У меня есть этот деструктор, который создает ошибку во время выполнения «векторный итератор не может быть разыменован».

gridMatrix - это std :: vector *> *> *> *>

Я добавил typename, а также typedef, но у меня все еще есть ошибка.

Я перейду к этой идее vect of vect * vect *, чтобы использовать boost :: multi_array Я думаю, но все же я хочу понять, где это неправильно.

/// @brief destructor
~AtomsGrid(void) {
  // free all the memory for all the pointers inside gridMatrix (all except the  Atom<T>* )
  //typedef typename ::value_type value_type;

  typedef std::vector<AtomsCell< Atom<T>* >*> std_vectorOfAtomsCell;
  typedef std::vector<std_vectorOfAtomsCell*> std_vectorOfVectorOfAtomsCell;

  std_vectorOfAtomsCell* vectorOfAtomsCell;
  std_vectorOfVectorOfAtomsCell* vectorOfVecOfAtomsCell;
  typename std_vectorOfVectorOfAtomsCell::iterator itSecond;
  typename std_vectorOfVectorOfAtomsCell::reverse_iterator reverseItSecond;
  typename std::vector<std_vectorOfVectorOfAtomsCell*>::iterator itFirst;


  //typename std::vector<AtomsCell< Atom<T>* >*>* vectorOfAtomsCell;
  //typename std::vector<std::vector<AtomsCell< Atom<T>* >*>*>* vectorOfVecOfAtomsCell;
  //typename std::vector<std::vector<AtomsCell< Atom<T>* >*>*>::iterator itSecond;
  //typename std::vector<std::vector<AtomsCell< Atom<T>* >*>*>::reverse_iterator reverseItSecond;
  //typename std::vector<std::vector<std::vector<AtomsCell< Atom<T>* >*>*>*>::iterator itFirst;


  for (itFirst = gridMatrix.begin(); itFirst != gridMatrix.end(); ++itFirst) {
    vectorOfVecOfAtomsCell = (*itFirst);
    while (!vectorOfVecOfAtomsCell->empty()) {
      reverseItSecond = vectorOfVecOfAtomsCell->rbegin();
      itSecond = vectorOfVecOfAtomsCell->rbegin().base();

      vectorOfAtomsCell = (*itSecond); // ERROR during run: "vector iterator not dereferencable"
      // I think the ERROR is because I need some typedef typename or template ???!!!
      // the error seems here event at itFirst

      //fr_Myit_Utils::vectorElementDeleter(*vectorOfAtomsCell);
      //vectorOfVecOfAtomsCell->pop_back();
    }
  }
  fr_Myit_Utils::vectorElementDeleter(gridMatrix);
}

Если кому-то нужен полный код, создающий ошибку, я с удовольствием его сообщу, но я не думаю, что мы можем прикрепить файл на форуме. НО все же он не очень большой, поэтому, если вы хотите, я могу скопировать его сюда.

Спасибо

1 Ответ

3 голосов
/ 07 мая 2010

Если v является std::vector, тогда v.rbegin().base() == v.end() является истинным. В вашем коде itSecond фактически равно vectorOfVecOfAtomsCell.end(), что находится за пределами конца вектора и не может быть разыменовано. См. MSDN страницу для reverse_iterator::base для получения дополнительной информации.

Что касается решений: в коде, который вы разместили, я не совсем понимаю, зачем вам вообще нужен itSecond. vectorOfAtomsCell = *reverseItSecond должен дать ожидаемый результат без ошибок. Если вам действительно нужен итератор для последнего элемента, вы должны либо выполнить itSecond = vectorOfVecOfAtomsCell->end()-1, либо itSecond = reverseItSecond.base()-1.

...