Je suis actuellement en train de coder un jeu et j'ai un petit problème (gros en fait) : à chaque nouvelle partie lancée, la mémoire que prend le programme augmente (en fait, au lieu de libérer l'ancienne, ça libère rien du tout et ça réalloue de la mémoire).
Bon c'est un peu vague dit comme ça, donc je vais vous expliquer ce que j'ai compris.
En fait, j'alloue de la mémoire dynamiquement sur des SDL_Surface* et pas moyen de libérer le malloc ...
voici un bout de programme pour vous montrer comment je m'y prends :
Si tu es sous Linux, il y a le greffon Valgrind qui te permet de traquer les fuites de mémoires (Valgrind est incorporé dans certains IDE , comme Codeblocks, Codelite, etc...). Il y a un tutoriel sur Open classrooms.
Sinon: je vois pas au premier abord de bug dans le bout de code que tu nous as posté. Par contre j'ai une recommandation : si tu utilises SDL_TTF , il faut libérer la SDL_Surface* avant de créer une autre SDL_Surface* avec TTF_FonctionDeSDLTTFQuiCreerUneTextureDeTexte(TTF_Font *font, const char*). Je te dis ça parce que si ton programme crée dans une boucle while() des SDL_Surface* ; donc pendant l' exécution d'un niveau ou d'une partie (par opposition à un stade du jeu où tu est par exemple dans le menu des options ou le menu principal) , les SDL_Surface* précédentes non libérées vont s'accumuler dans la mémoire donnant le phénomène que tu décris plus haut.
J'ai vérifié et j'avais oublié de libérer une police mais c'était la seule du programme et ça n'a absolument rien changé ... :/
Merci quand même ! d'autres idées ?
Je peux vous donner des précisions sur mon jeu pour pouvoir avoir des idées.
Je charge mes images, mes animations, polices et sons, et je lance le jeu. Quand je lance le jeu, j'ai une fonction "initAnim" qui initialise mes images que je modifie au cours du temps (je les aggrandis, etc ...) d'où le principe d'avoir une image de base et une actuelle, modifiée. Ensuite, j'ai une boucle de jeu normale où le jeu se passe, et à la fin de la partie, je libère les surfaces et je les recharge mais celles qu'il faut quand je recommence la partie.
....j'ai une fonction "initAnim" qui initialise mes images que je modifie au cours du temps (je les aggrandis, etc ...) ....
Très bien, mais en général, redimensionner une image (ou en faire une rotation) crée une nouvelle surface. As-tu penser à libérer ces nouvelles surfaces ?
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
rotozoom() crée une surface temporaire, qui est renvoyée.
DONC: image=rotozoom(image,...): le pointeur correspondant à la variable image passé en paramètre est perdu lors de l'affectation. Donc tu perds de la place. Donc oui, il faut passer par une surface intermédiaire. Voilà pourquoi tu perds de la mémoire.... heu, enfin, ton progamme....
- Edité par edgarjacobs 24 mai 2018 à 23:35:00
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
En vrai je perds vraiment la mémoire, j'aurais dû m'en souvenir ...
Merci beaucoup ! Il est tard je vais me coucher j'ai cours tôt demain, mais je modifie tout ça dès que possible et je vous dit si il y a du mieux
Encore merci et bonne soirée !
mémoire qui augmente à chaque nouvelle partie
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Mon site web de jeux SDL2 entre autres : https://www.ant01.fr
Mon site web de jeux SDL2 entre autres : https://www.ant01.fr
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent