Bonsoir,
J'ai une classe nommée Hermes qui est un singleton.
Elle est globale à tout le programme et est initialisée à NULL.
Cette classe comporte un attribut public qui est un manager de ressources (ici des sf::Texture).
On la nommera TextureManager.
TextureManager possède un attribut private qui est le suivant :
std::map<std::string, sf::Texture*> Textures;
La classe Hermes est initialisée tel que :
Hermes *Hermes::_instance = NULL;
Dans mon TextureManager j'ai une méthode qui va effectuer un find sur le std::map Textures
C'est là que ça pète.
J'ai une access violation :
0xC0000005: Access violation reading location 0x00000008
Suite à mes recherches, le problème viendrait du fait que le std::map n'est pas correctement initialisé.
Je ne vois vraiment pas ce qu'il faut faire par contre. Comment initialiser ce std::map ?
Je n'ai jamais rien fait d'autre que de déclarer un std::map et de m'en servir, sans étape préalable...
J'espère avoir été clair dans l'exposition de mon problème.
Au besoin, je peux vous montrer le code des classes que vous souhaitez voir.
D'avance merci pour votre aide
Bonne soirée
EDIT : Ajout du code épuré et condensé au possible :
Main.cpp
Hermes.hpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #include "Hermes.hpp" int main() { // Hermes Hermes *Hermes = Hermes::GetInstance(); engine Engine; // main loop... while(engine.isRunning()) { engine.Update(); } Hermes->Kill(); return 0; }
Hermes.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include "TextureManager.hpp" class Hermes { public: static Hermes* GetInstance(); static void Kill(); TextureManager TxMgr; private: Hermes(); ~Hermes(); static Hermes* _instance; };
TextureManager.hpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include "Hermes.hpp" Hermes *Hermes::_instance = NULL; Hermes::Hermes(){} Hermes::~Hermes(){} Hermes* Hermes::GetInstance() { if(_instance != NULL) _instance = new Hermes(); return _instance; } void Hermes::Kill() { if(_instance != NULL) { delete _instance; _instance = NULL; } }
TextureManager.hpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 class TextureManager { private: std::map<std::string, sf::Texture*> Textures; bool Search(const std::string &link); bool Add(const std::string &link); public: TextureManager(); ~TextureManager(); sf::Texture& Get(const std::string &link); void Delete(const std::string &link); };
Dans la méthode Update qui est dans le Main, j'essaie donc de récupérer un sf::Texture en faisant ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 TextureManager::TextureManager(){} TextureManager::~TextureManager() { std::map<std::string, sf::Texture*>::iterator it; for(it = Textures.begin(); it != Textures.end(); it++) delete it->second; } bool TextureManager::Search(const std::string &link) { std::map<std::string, sf::Texture*>::iterator it; /* C'est ici que ça fail ... */ it = Textures.find(link); /* ------------------------- */ if(it == Textures.end()) return false; return true; } bool TextureManager::Add(const std::string &link) { sf::Texture *tmp = new sf::Texture; if(!tmp->loadFromFile("assets/textures/" + link)) { delete tmp; return false; } this->Textures.insert(std::make_pair(link, tmp)); return true; } sf::Texture& TextureManager::Get(const std::string &link) { if(!Search(link)) this->Add(link); return *Textures.find(link)->second; } void TextureManager::Delete(const std::string &link) { std::map<std::string, sf::Texture*>::iterator it; it = Textures.find(link); if(it != Textures.end()) { delete it->second; Textures.erase(it); } }
sf::Texture tex = Hermes::GetInstance()->TxMgr.Get("bg");
Voilà, j’espère que ce n'est pas trop long...
Partager