2010-05-07 13 views
0

我有這個析構函數在運行時創建錯誤「vector iterator not derefereenable」。矢量迭代器不能在運行時在一個矢量上無法取消<vector <vector<A*> *> *>

的gridMatrix是一個std ::矢量<的std ::矢量<的std ::矢量< AtomsCell <原子<Ť> > * * * > > > *

我增加了類型名,並且還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

typename和typedef不會在運行時產生任何影響。 – 2010-05-07 09:38:00

+0

你爲什麼要把所有東西都指向一個指針?使用具體類型和智能指針,您可能根本不需要析構函數。 – 2010-05-07 09:44:27

+0

謝謝,我知道這個typename和typdef在這裏沒用。 – marouanebj 2010-05-07 13:14:08

回答

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

+0

非常感謝,它很有用,而且很好,因爲我學到了一些我認爲是新的東西。 – marouanebj 2010-05-07 13:13:10

+0

有趣的是,我真的不知道'reverse_iterator :: base(誰使用反向迭代器?:)我看着你的代碼,認爲「base(),wtf?」看着它,問題變得明顯。我今天也學到了一些東西 – sbk 2010-05-07 16:35:31

相關問題