Erreur bizarre dans VS2013 Express (resolu)

Erreur bizarre dans VS2013 Express (resolu) - C++ - Programmation

Marsh Posté le 26-12-2014 à 21:58:10    

Hello,  
 
J'ai un étrange bug depuis peu, quand je compile et j’exécute le code suivant :  

  • en mode Debug + Start without debug : [:kukrapok:4]
  • en mode Debug + Local Windows Debugger : [:kukrapok:4]
  • en mode Release + Start without debug : [:kukrapok:4]
  • en mode Release + Local Windows Debugger : [:kukrapok:3] : Erreur "0xC0000005: Access violation"  :heink:  


 
En traçant le code pas à pas à la 1er itération de la boucle for, j'obtiens :

Code :
  1. void MenuState::update()
  2. {
  3.   if (!m_gameObjects.empty())
  4.   {
  5.     for (std::vector<GameObject*>::size_type i = 0; i < m_gameObjects.size(); i++) // le m_gameObjects.size() est de 2, normal.
  6.     {
  7.       if (m_gameObjects[i] != nullptr) // le m_gameObjects.size() passe à 0 d'un coup.
  8.       {
  9.         m_gameObjects[i]->update(); // au retour de ->update() le m_gameObjects.size() passe à ???. (le vecteur est détruit ? O_o )
  10.       }
  11.     }
  12.   }
  13. }


 
A la 2nd itération de la boucle for :

Code :
  1. void MenuState::update()
  2. {
  3.   if (!m_gameObjects.empty())
  4.   {
  5.     for (std::vector<GameObject*>::size_type i = 0; i < m_gameObjects.size(); i++) // le m_gameObjects.size() est à ???  
  6.     {
  7.       if (m_gameObjects[i] != nullptr) // le m_gameObjects.size() passe à 3375104 d'un coup.   
  8.       {
  9.         m_gameObjects[i]->update(); // au retour de ->update() le m_gameObjects.size() passe à ???.
  10.       }
  11.     }
  12.   }
  13. }


 
le contexte:

Code :
  1. // declaration
  2. #include <vector>
  3. #include "GameState.h"
  4. #include "GameObject.h"
  5. class MenuState :
  6.     public GameState
  7. {
  8. public:
  9.   virtual bool onEnter();
  10. /*
  11.   code  
  12. */
  13. private:
  14.   std::vector<GameObject*> m_gameObjects; // la class GameObject est une class de Base Virtuel Pure  
  15. /*
  16.   code  
  17. */
  18. };
  19. // definition et implementation
  20. #include "MenuState.h"
  21. bool MenuState::onEnter()
  22. {
  23.   GameObject* button1 = new MenuButton(); // La class MenuButton qui est une class fille de GameObject
  24.   GameObject* button2 = new MenuButton();
  25.   m_gameObjects.push_back(button1);
  26.   m_gameObjects.push_back(button2);
  27.   return true;
  28. }


 
Mes hypothèses:
 
-1- MenuButton ne respectant pas la règle (rule of 5) pour les constructeurs, fait que l’opérateur par défaut "operator[]" modifie probablement m_gameObjects, ou quelque chose dans ce genre. :(  
-2- J'ai dût louper un chapitre sur std::vector.  :whistle:  
-3- C'est juste un bug du debugger et je ne dois pas en tenir compte.  [:cerveau makokotte]  
-4- L'auteur du livre c'est Obiwan et il n'y a que chez lui que ça marche.  :o  

Spoiler :


Trois jours que je suis dessus...
 
[:ponaygay:4]


Message édité par bqron le 27-12-2014 à 22:01:03
Reply

Marsh Posté le 26-12-2014 à 21:58:10   

Reply

Marsh Posté le 26-12-2014 à 22:09:04    

non, si tu itères sur les éléments d'un vecteur et que tu change la taille du vecteur en cours de route, ça fait mal, c'est normal

Reply

Marsh Posté le 27-12-2014 à 22:00:10    

Bon j'ai trouver grâce à GDB, car le debugger de VStudio ne rentre pas dans les callback [:canardeur]  
 
La fonction update() appelle une fonction callback qui va modifier les éléments de m_gameObjects, d'où erreur de segmentation/violation d’accès.
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed