簡體   English   中英

向量迭代器在運行時在向量上不可引用 <vector<vector<A*> *&gt; *&gt;

[英]vector iterator not dereferencable at runtime on a vector<vector<vector<A*>*>*>

我有這個析構函數,它在運行時創建錯誤“矢量迭代器不可解引用”。

gridMatrix是std :: vector <std :: vector <std :: vector <AtomsCell <Atom <T> *> *> *> *>

我添加了類型名和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);
}

如果有人想要產生錯誤的完整代碼,我很樂意提供,但是我認為我們不能在論壇中附加文件。 但是仍然不是很大,所以如果您願意,我可以在這里復制過去。

謝謝

如果vstd::vectorv.rbegin().base() == v.end()為true。 在您的代碼中, itSecond實際上等於vectorOfVecOfAtomsCell.end() ,它超出了向量的范圍並且不可取消引用。 有關更多信息,請參見MSDN頁面上的reverse_iterator::base

關於解決方案:在您發布的代碼中,我真的看不到為什么需要itSecond vectorOfAtomsCell = *reverseItSecond應該產生預期的結果,而不會出現錯誤。 如果確實需要最后一個元素的迭代器,則應該執行itSecond = vectorOfVecOfAtomsCell->end()-1itSecond = reverseItSecond.base()-1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM