tu me rassure.
Version imprimable
Avec SDL les fuites de mémoires sont souvent dues aux chargements d'images à répétition. Es-tu sûr que tu n'utilises pas SDL_LoadBMP en boucle ?
De cette façon :
--> fuites de mémoireCode:
1
2
3
4
5
6 SDL_Surface *surface; surface = SDL_LoadBMP("test.bmp"); <-- 1ère allocation ... surface = SDL_LoadBMP("test.bmp"); <-- 2ème allocation ... SDL_FreeSurface(surface); <-- désallocation de la 2ème et pas de la 1ère
Il faut faire :
Bon je peux me tromper ça fait quelque temps que je n'ai pas touché à la SDL, mais j'en suis quasiement sûr.Code:
1
2
3
4
5
6
7 SDL_Surface *surface; surface = SDL_LoadBMP("test.bmp"); ... SDL_FreeSurface(surface); surface = SDL_LoadBMP("test.bmp"); ... SDL_FreeSurface(surface);
Erreur qu'une classe bien codée ne permet plus de faire. 8-)
tu utilises quel compilateur/debuggeur ?
J'utilise Code::Blocks et son débuggeur intégré. J'ai vu aussi récemment la news sur "DDD", je ne sais pas si ça pourrait m'aider...
En ce qui concerne l'allocation d'une surface SDL en boucle, je pense plutôt que ça doit être l'appel en boucle d'une méthode qui alloue, vu que je ne suis pas encore tout à fait à l'aise avec le mécanisme des classes. En tout cas, je ne trouve pas l'erreur.
Je peux vous donner le code source si vous voulez, il n'est pas très long. Bon quand même je vous préviens : il doit y avoir plein de maladresses, ou d'erreurs de programmation, dues notamment aux dernières modifications que j'ai faites pour chercher à résoudre le problème. Et également, je ne vérifie pas que mes allocations fonctionnent bien, je comptais le faire à la fin. Enfin bref voilà la source (avec images, projet Code::Blocks et exécutable) : http://kokospace.free.fr/autres/jodowsmediaplayer.zip
Si quelqu'un arrivait à trouver l'erreur (ou les erreurs ?), ce serait vraiment chouette. A mon avis, il doit y avoir une histoire de classes. Mais de toute façon, je vais certainement recoder le tout avec des classes bien robustes :mrgreen:
En regardant vite fait ton code, dans la fonction,
void DialogOpen::dessiner(SDL_Event *event), je n'est pas trouvé la destruction de rectangle.
Sinon, juste une remarque, dans la fonction void Dialog::dessiner(), est tu vraiment obligé de recharger tes images stockées dans le tableau fenetre?
Ah mais bien sûr ! La voilà, l'erreur :aie: J'ai pensé à détruire la surface dans le destructeur, et je n'ai pas pensé à le faire à chaque appel de la fonction... Maintenant que ça marche, c'est merveilleux... :mouarf:
Enfin bien sûr, il subsiste toujours quelques fuites de mémoires, bien moins importantes, mais bon... Je vais donc essayer ces fameux RAII.
Euh en fait c'est une de ces modifications dont je parlais. Je me suis dit que le problème aurait pu venir de là, et j'ai évité de garder quoi que ce soit en mémoire :?
Enfin bon le problème est résolu, et je vous remercie tous pour votre précieuse aide :roll:
Euh c'est une bonne question 8O Ce serait en effet bien utile, notamment à cause de tous les ".c_str()" que je suis obligé d'utiliser à tout bout de champ...
Mais apparemment il n'y en a pas (officiellement en tout cas) :Mais de toute façon, les RAII facilitent considérablement les choses. J'ai déjà implémenté une ébauche de classe RAII pour les surfaces SDL, et le code du main est trente fois plus simple :Citation:
Envoyé par http://www.libsdl.org/
:PCode:
1
2
3
4
5 RAII_Surface image("images/test.bmp"); image.setColorKey(32,59,84); image.setAlpha(128); image.fill(255,255,0); image.blit(ecran, 30, 30);
Il y a la SFML qui est semblable à la SDL mais en orienté objet.
Oui, j'en ai entendu parler, mais (je me trompe peut-être) ça me semble moins complet que la SDL. Ce qu'il y a de bien, c'est qu'on peut ouvrir plusieurs fenêtres :mrgreen:
Moi justement je trouve ça plus complet que la SDL (mais bon, je connais pas vraiment toutes les fonctions de la SDL), et il faut pas oublier que le projet est jeune et qu'il va s'étoffer au fil du temps.
De plus, SFML est developpé principalement par un des membres du forum, Laurent "Loulou" Gomila pour ne pas le citer ; ce qui assure un service après-téléchargement du tonerre ! :king:
Et si tu veux voir du code très bien ecrit en C++, il te suffira d'aller regarder du côté des sources en plus ! 8-)