Bonjour,
j'utilise depuis quelques temps la tesselation pour effectuer le rendu de polygônes convexes. Ca marche très bien...jusqu'à ce que je me rende compte que la combine Callback cause des memory leak...
Voici le code de ma callback:
C'est calqué sur le code du red book (en plus simple car je n'ai pas besoin d'interpoler les couleurs ou les normales...) donc a priori...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 void CALLBACK combineCallback(GLdouble coords[3], GLdouble *vertex_data[4], GLfloat weight[4], GLdouble **dataOut) { GLdouble *vertex; vertex = (GLdouble *) malloc(3 * sizeof(GLdouble)); vertex[0] = coords[0]; vertex[1] = coords[1]; vertex[2] = coords[2]; *dataOut = vertex; }
Bon, ce que fait la callback: elle alloue de la memoire pour un vertex et l'envoit en sortie... je m'attendrai donc a ce qu'OpenGL (ou GLU dans ce cas) libere la memoire de lui-même apres utilisation du vertex, mais non...
J'ai trouvé cet exemple: http://www.codeguru.com/cpp/g-m/open...icle.php/c9137
où la combine callback est implémentée comme suit:
Là on garde une trace de la mémoire allouée pour pouvoir la libérer après le dessin.
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 CPtrList CMFCTessView::gm_VertexPtrList ; //static memvar used to keep track of newly allocated vertices void CALLBACK CMFCTessView::combineCallback(GLdouble coords[3], GLdouble *vertex_data[4], GLfloat weight[4], GLdouble **dataOut ) { GLdouble *vertex = new GLdouble[6] ; gm_VertexPtrList.AddTail( vertex ) ; //keep track for later delete[] at bottom of CMFCTessView::OnDraw() vertex[0] = coords[0]; vertex[1] = coords[1]; vertex[2] = coords[2]; vertex[3] = vertex[4] = vertex[5] = 0. ; //01/13/05 bugfix *dataOut = vertex; }
Ca peut bien entendu résoudre mon problème mais:
- Est-ce normal?
- Si oui, comment une telle erreur de conception peut rester encore présente des années après la sortie de GLU 1.2???
- Et toujours si oui, pourquoi n'est ce documenté nul part, et en particulier pas dans le red book?
=> ce qui me fait penser que non, ca n'est pas normal, mais en meme temps comme je trouve des exemples comme celui ci-dessus....
Bref, j'attends avec impatience vos avis sur ce truc à priori abherrant...![]()
Partager