2010-05-07 44 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

相关问题