2015-10-10 1 views
0

je un suivant C++ code:c de l'emplacement lecture de violation d'accès tout en effaçant la liste

typedef std::list<Volume>::iterator pVolume; 
typedef std::list<pVolume>::iterator ppVolume; 
void Node::delVolume(pVolume _volume) 
{ 
    for(ppVolume it = m_volumes.begin(); it != m_volumes.end();) 
     if((*it) == _volume) 
     { 
      it = m_volumes.erase(it); 
      break; 
     } 
     else 
      it++; 
} 

il obtient une erreur

Unhandled exception at 0x009a3c79 in Delone3D.exe: 0xC0000005: Access violation reading location 0xfeeefef2.

exactement lors de l'effacement. Le débogage montre que ni "it" ni "_volume" n'est null pointeur.

Pour quelles autres raisons cela peut-il se produire?

+1

A quoi ressemble le destructeur Volume? –

+0

Le destructeur de volume est vide. Tous les arguments du volume sont statiques. Dans cette fonction, je supprime uniquement le pointeur sur Volume et non sur l'objet lui-même. –

+0

Eh bien, nous ne pouvons rien dire, si vous ne montrez pas le code pertinent dans son contexte. –

Répondre

2

Le code que vous montrez est correct, il semble qu'il y ait un problème ailleurs dans votre application. Le motif de mémoire 0xfeeefef2 (quelques adresses au-dessus de 0xfeeefeee) indique une mémoire dynamique libérée, voir here.

Vous pouvez massivement simplifier votre code, en passant:

// for std::list, as in your example 
m_volumes.remove(_volume); 

// for std::vector and std::deque 
auto itr = std::remove(m_volumes.begin(), m_volumes.end(), _volume); 
m_volumes.erase(itr, m_volumes.end()); 
-2

J'ai trouvé le lieu de générer l'erreur. Mais je n'ai aucune idée pourquoi.

Toute mon code met en œuvre comme héritiers de classe abstraite événement

class Event 
{ 
public: 
    Event() { } 
    ~Event() { } 

    virtual void Implement(void) abstract; 
    virtual void ReturnColors(void);  
private: 
}; 

Il y a deque de pointeurs vers des événements

std::deque< Event * > m_triangulationEvents; 

qui sont utilisés suivant façon

void Delaunay3D::nextEvent() 
     { 
      if(!m_triangulationEvents.empty()) 
      { 
       m_prevEvent->ReturnColors(); 

       Event * cur = m_triangulationEvents.front(); 
       m_triangulationEvents.pop_front(); 
       cur->Implement(); 

       delete m_prevEvent; 
       m_prevEvent = cur; 
      } 
     } 

Le problème étaient au

delete m_prevEvent; 

chaîne. Le commentant ou en utilisant

m_prevEvent.~Event(); 

résultats dans l'application de travail bien. Merci pour tout le monde.

P.S. @TheOperator merci de mentionner la mémoire dynamique libérée

+0

-1 - Votre correctif n'est pas un correctif. Vous n'êtes pas censé appeler le destructeur explicitement comme ça. Le seul problème flagrant avec votre code est que votre classe 'Event' n'a pas de destructeur virtuel. – PaulMcKenzie

+0

Oui, après avoir ajouté un mot clé virtuel, cela fonctionne bien –