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à :



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
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.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
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;
 
};
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
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);
}
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

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