2010-05-07 8 views
0

J'ai ce destructeur qui crée une erreur à l'exécution "vector itérateur non déréférencable".itérateur vectoriel non déréférencable à l'exécution sur un vecteur <vector <vector<A*> *> *>

Le gridMatrix est un vecteur std :: < std :: vector < std :: vecteur < AtomsCell < Atom <T> * > * > * > * >

j'ai ajouté le typename et aussi le typedef mais J'ai toujours l'erreur.

Je vais me déplacer pour cette idée de vect de vect * de vect * pour utiliser boost :: multi_array Je pense, mais je veux quand même comprendre si c'était faux.

/// @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); 
} 

Si quelqu'un veut le code complet qui crée l'erreur, je suis heureux de donner, mais je ne pense pas que nous pouvons joindre un fichier dans le forum. MAIS, ce n'est pas très grand, donc si vous le voulez, je peux le copier ici.

Merci

+1

typenamef et typedef ne fera probablement aucune différence lors de l'exécution. –

+0

Pourquoi faites-vous tout un pointeur? Avec les types concrets et les pointeurs intelligents, vous n'avez peut-être pas besoin d'un destructeur. –

+0

Merci, j'ai obtenu ce typename et typdef sont inutiles ici. – marouanebj

Répondre

3

Si v est un std::vector alors v.rbegin().base() == v.end() est vrai. Dans votre code, itSecond est en fait égal à vectorOfVecOfAtomsCell.end(), ce qui est au-delà de la fin du vecteur et non déréférencable. Voir le MSDN page for reverse_iterator::base pour plus d'informations. En ce qui concerne les solutions: dans le code que vous avez posté, je ne vois pas vraiment pourquoi vous avez besoin de itSecond. vectorOfAtomsCell = *reverseItSecond devrait donner le résultat que vous attendez, sans l'erreur. Si vous avez vraiment besoin d'un itérateur pour le dernier élément, vous devez soit faire itSecond = vectorOfVecOfAtomsCell->end()-1 ou itSecond = reverseItSecond.base()-1.

+0

Merci beaucoup, ça marche, et c'est bien parce que j'ai appris quelque chose que je pensais nouveau. – marouanebj

+0

Chose amusante, je ne connaissais pas vraiment 'reverse_iterator :: base' (qui utilise des itérateurs inversés de toute façon? :) J'ai regardé votre code, j'ai pensé" base(), wtf? " leva les yeux et le problème devint apparent. J'ai aussi appris quelque chose aujourd'hui – sbk

Questions connexes