矢量迭代器在运行时在矢量<vector <vector <a *> *&gt; *&gt; </vector <vector <a *>上不可解除引用

时间:2010-05-07 09:24:15

标签: c++ stl iterator containers dereference

我有这个析构函数在运行时创建错误“vector iterator not dereferencable”。

gridMatrix是std :: vector&lt; std :: vector&lt; std :: vector&lt; AtomsCell&lt;原子&LT; T&GT; *&gt; *&gt; *&gt; *&gt;

我添加了typename和typedef,但我仍然有错误。

我会采用vect * 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 个答案:

答案 0 :(得分:3)

如果vstd::vector,则v.rbegin().base() == v.end()为真。在您的代码中,itSecond实际上等于vectorOfVecOfAtomsCell.end(),它超出了向量结束而不是可解除引用。有关详细信息,请参阅MSDN page for reverse_iterator::base

至于解决方案:在你发布的代码中,我真的不明白为什么你需要itSecondvectorOfAtomsCell = *reverseItSecond应该产生您期望的结果,而不会出现错误。如果您确实需要最后一个元素的迭代器,则应该itSecond = vectorOfVecOfAtomsCell->end()-1itSecond = reverseItSecond.base()-1