Bonjour,

Mon objectif est d'éviter les fuites mémoires. Avec valgrind si je ne mets pas de "delete testsOpengl;" dans le destructeur ~TestsRender() j'obtiens une fuite mémoire. Par contre si je mets un "delete testsOpengl;" dans le destructeur j'ai pas de fuite mémoire mais par contre valgrind me dit ceci :
"pure virtual method called
terminate called without an active exception
"

Je crois que ça vient du fait qu'il repasse plusieurs fois sur le destructeur de testsOpengl.
Avec le debuger j'ai relevé l'ordre de destruction, et ça me donne ceci dans l'ordre : ~TestsOpengl() ---> ~Render() ---> ~TestsOpengl() ---> ~Tests() ---> ~TestsRender()

J'aimerais bien sortir proprement de mon programme, merci d'avace voici le code sans les headers :

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
 
#include "tests.h"
#include "rendering/render.h"
int main(int argc, char *argv[])
{
 
    QApplication Application(argc, argv);
    // pour libérer la mémoire après la fermeture de la dernière fenêtre
    QApplication::setQuitOnLastWindowClosed(false);
 
#ifdef TESTS
 
    Tests tests;
    tests.run_tests();
 
#endif //TESTS
 
    Application.exec();
    return 0;
}
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
 
#include "tests.h"
Tests::Tests() {
}
 
Tests::~Tests() {
        delete testsRender;
}
 
void Tests::run_tests() {
 
    // Instanciation des classes pour lancer les tests
    testsRender = new rendering::TestsRender();
 
    std::vector<QObject*>::iterator iSuite;
    for (iSuite = QTestSuite::m_suites.begin(); iSuite != QTestSuite::m_suites.end(); ++iSuite)
    {
        QTest::qExec(*iSuite);
    }
}
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 "testsRender.h"
 
namespace rendering {
 
    TestsRender::TestsRender() {
        testsOpengl = new TestsOpengl(24, 1000);
        testsOpengl->setGeometry(200,200,400,400);
        testsOpengl->show();
    }
 
    TestsRender::~TestsRender() {
        delete testsOpengl;
        testsOpengl = nullptr;
    }
}
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 "testsOpengl.h"
 
namespace rendering {
 
TestsOpengl::TestsOpengl(const quint16 &framesPerSecond, const quint16 &interval_time) : Render(framesPerSecond, interval_time) {
}
 
TestsOpengl::~TestsOpengl() {
}
 
void TestsOpengl::paintGL()
{
 
    // nettoie les buffers
    // GL_COLOR_BUFFER_BIT : Indique les buffers courrants actifs pour une écriture des couleurs
    // GL_DEPTH_BUFFER_BIT : Nettoie les Z-buffers (pour éviter la supperposition de couleurs arrière sur des couleurs avant)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // charge la matrice Identité
    glLoadIdentity();
 
    glTranslatef (0.0, 0.0, -5.0);
 
    // dessine le triangle
    glBegin (GL_TRIANGLES);
    glColor3f (1.0f, 0.0f, 0.0f);
    glVertex3f (-1.0f, -1.0f, 0.0f);
 
    glColor3f (0.0f, 1.0f, 0.0f);
    glVertex3f (1.0f, -1.0f, 0.0f);
 
    glColor3f (0.0f, 0.0f, 1.0f);
    glVertex3f (0.0f, 1.0f, 0.0f);
    glEnd ();
}
 
}
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
 
#include "render.h"
 
namespace rendering {
 
Render::Render(const quint16 &framesPerSecond, const quint16 &interval_time) : QGLWidget()
{
    //setWindowModality(Qt::ApplicationModal);
    setAttribute(Qt::WA_DeleteOnClose);
    QObject::connect(this, SIGNAL(WidgetClosed()), QApplication::instance(), SLOT(quit()));
 
    quint16 timerInterval = interval_time / framesPerSecond;
    t_Timer = new QTimer(this);
    connect(t_Timer, SIGNAL(timeout()), this, SLOT(timeOutSlot()));
    t_Timer->start( timerInterval );
 
    setAutoBufferSwap(true);
 
}
 
Render::~Render() {
   t_Timer->stop();
   delete t_Timer;
   t_Timer = nullptr;
}
 
void Render::closeEvent(QCloseEvent *event)
{
      emit WidgetClosed();
      event->accept();
}
 
// to make a pause or to play
void Render::change_play_pause(const bool &play_pause) {
}
 
bool Render::status_play_pause() {
    return play_pause;
}
 
void Render::timeOutSlot()
{
    updateGL();
}
 
void Render::initializeGL()
{
 
    // Les valeurs acceptées sont GL_MODELVIEW, GL_PROJECTION, et GL_TEXTURE
    glMatrixMode(GL_PROJECTION);
    // charge la matrice Identité
    glLoadIdentity();
    // Multiplie la matrice courante par la matrice perspective
    // left, right, bottom, top distance near, distance far
    glFrustum(-1, 1, -1, 1, 5, 7);
 
    // Retour au mode par défaut
    glMatrixMode(GL_MODELVIEW);
 
}
 
void Render::resizeGL(int width, int height)
{
 
    // spécifie les dimensions de la fenêtre visible sous opengl
    QSize viewport_size = size();
    glViewport(0, 0, viewport_size.width(), viewport_size.height());
 
}
 
void Render::paintGL()
{
}
 
}