Hello,
J'ai un étrange bug depuis peu, quand je compile et j’exécute le code suivant :
- en mode Debug + Start without debug :
- en mode Debug + Local Windows Debugger :
- en mode Release + Start without debug :
- en mode Release + Local Windows Debugger : : Erreur "0xC0000005: Access violation"
En traçant le code pas à pas à la 1er itération de la boucle for, j'obtiens :
Code :
- void MenuState::update()
- {
- if (!m_gameObjects.empty())
- {
- for (std::vector<GameObject*>::size_type i = 0; i < m_gameObjects.size(); i++) // le m_gameObjects.size() est de 2, normal.
- {
- if (m_gameObjects[i] != nullptr) // le m_gameObjects.size() passe à 0 d'un coup.
- {
- m_gameObjects[i]->update(); // au retour de ->update() le m_gameObjects.size() passe à ???. (le vecteur est détruit ? O_o )
- }
- }
- }
- }
|
A la 2nd itération de la boucle for :
Code :
- void MenuState::update()
- {
- if (!m_gameObjects.empty())
- {
- for (std::vector<GameObject*>::size_type i = 0; i < m_gameObjects.size(); i++) // le m_gameObjects.size() est à ???
- {
- if (m_gameObjects[i] != nullptr) // le m_gameObjects.size() passe à 3375104 d'un coup.
- {
- m_gameObjects[i]->update(); // au retour de ->update() le m_gameObjects.size() passe à ???.
- }
- }
- }
- }
|
le contexte:
Code :
- // declaration
- #include <vector>
- #include "GameState.h"
- #include "GameObject.h"
- class MenuState :
- public GameState
- {
- public:
- virtual bool onEnter();
- /*
- code
- */
- private:
- std::vector<GameObject*> m_gameObjects; // la class GameObject est une class de Base Virtuel Pure
- /*
- code
- */
- };
- // definition et implementation
- #include "MenuState.h"
- bool MenuState::onEnter()
- {
- GameObject* button1 = new MenuButton(); // La class MenuButton qui est une class fille de GameObject
- GameObject* button2 = new MenuButton();
- m_gameObjects.push_back(button1);
- m_gameObjects.push_back(button2);
- return true;
- }
|
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.
-3- C'est juste un bug du debugger et je ne dois pas en tenir compte.
-4- L'auteur du livre c'est Obiwan et il n'y a que chez lui que ça marche.
Spoiler :
Trois jours que je suis dessus...
|
Message édité par bqron le 27-12-2014 à 22:01:03