Bonsoir,
J'ai décidé depuis quelques jours de revoir l'architecture et l'organisation des classes de mon logiciel de visualisation d'objets en 3D avec Qt5/OpenGL4. Mon programme fonctionne plutôt bien et affiche correctement les models (de type .obj, .lwo, .3ds ...etc) que je lui fournis donc pas de soucis à ce niveau là. Je décide de tester le tout avec Valgrind pour voir si il n'y a pas de problème au niveau de la gestion de la mémoire... Bon c'est un peu la douche froide de ce côté là :
- 264 bytes in 1 blocks are definitely lost in loss record 686 of 839 dans src/objects/model.cpp:33
- 264 bytes in 1 blocks are definitely lost in loss record 687 of 839 dans src/objects/model.cpp:34
- 264 bytes in 1 blocks are definitely lost in loss record 688 of 839 dans src/objects/model.cpp:35
- 288 (48 direct, 240 indirect) bytes in 1 blocks are definitely lost in loss record 693 of 839 dans src/materials/texturemanager.cpp:35
- 1,584 (48 direct, 1,536 indirect) bytes in 1 blocks are definitely lost in loss record 768 of 839 dans src/objects/meshmanager.cpp:40
- 1,584 (48 direct, 1,536 indirect) bytes in 1 blocks are definitely lost in loss record 769 of 839 dans src/materials/materialmanager.cpp:41
- 262,140 bytes in 1 blocks are possibly lost in loss record 829 of 839 dans src/objects/modelloader.cpp:124
- 524,280 bytes in 1 blocks are possibly lost in loss record 830 of 839 dans src/objects/modelloader.cpp:120
- 12,582,912 bytes in 3 blocks are possibly lost in loss record 837 of 839 dans Texture::load() dans src/materials/texture.cpp:58
- 15,456,715 (48 direct, 15,456,667 indirect) bytes in 1 blocks are definitely lost in loss record 838 of 839 dans src/objects/modelmanager.cpp:31
Je vous mets à disposition le code source de la classe ModelManager.h associée à la dernière erreur signalée par Valgrind. Je vais peut-être résoudre le reste si on y arrive pour celle-çi.
Voici le code de la classe qui doit charger et créer un model dans la scene. J'ai mis en rouge la ligne qui alloue dynamiquement de la mémoire pour un model et qui est signalée par Valgrind:
AbstractModelManager.h
ModelManager.h
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 <string> #include <memory> using namespace std; class AbstractModel; class AbstractModelManager { public: AbstractModelManager(); virtual AbstractModel* getModel(const string& name) = 0; virtual void loadModel(const string& name, const string& filename) = 0; virtual unique_ptr<AbstractModel> createModel(const string& name) = 0; };
ModelManager.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
17
18
19
20
21
22
23
24 #include "abstractmodelmanager.h" #include "modelloader.h" class Scene; class Model; class AbstractModel; class ModelManager : public AbstractModelManager { public: ModelManager(Scene* scene); virtual ~ModelManager(); virtual AbstractModel* getModel(const string& name); virtual void loadModel(const string& name, const string& filename); virtual unique_ptr<AbstractModel> createModel(const string& name); private: Scene* m_scene; ModelLoader m_modelLoader; map<string, unique_ptr<Model>> m_models; };
Voila, malgré l'utilisation de unique_ptr, il y a quand même une fuite de mémoire de 15Mo... je ne sais vraiment pas comment résoudre ce problème
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 #include "modelmanager.h" #include "scene.h" #include "model.h" #include "abstractmodel.h" ModelManager::ModelManager(Scene* scene) : m_scene(scene), m_modelLoader(ModelLoader()) {} ModelManager::~ModelManager() {} AbstractModel* ModelManager::getModel(const string& name) { if(m_models.find(name) != m_models.end()) { return m_models[name].get(); } return nullptr; } void ModelManager::loadModel(const string& name, const string& filename) { vector<shared_ptr<ModelData>> modelData = m_modelLoader.loadModel(name, filename); m_models[name] = unique_ptr<Model>(new Model(m_scene, modelData)); } unique_ptr<AbstractModel> ModelManager::createModel(const string& name) { if(m_models.find(name) != m_models.end()) { return unique_ptr<AbstractModel>(new Model(*m_models[name].get())); } return unique_ptr<AbstractModel>(nullptr); }
Merci d'avance
EDIT :
Le problème est peut-être causé par une autre classe, le reste du code source est disponible dans mon dépôt sur github : https://github.com/hardware/ObjectVi...er/src/objects
Et voici le diagramme de classes que j'ai fait récemment. il n'est pas finalisé, il y a peut-être des erreurs : http://image.noelshack.com/fichiers/...assdiagram.png
Partager