# Gestion de mémoire : SDL a des fuites ?



## Gandahar (26 Février 2011)

Bonjour, 

Utilisant SDL et ayant un très gros programme à écrire, j'ai eu l'idée de vérifier que je n'avais pas de fuite mémoire avec ce que j'ai déjà écrit. Quelle n'a pas été ma surprise de constater que la mémoire n'arrête pas d'augmenter même si j'arrête toute animation, musique ou toute autre action dans le logiciel !

Pour en avoir le coeur net, j'ai écrit un minuscule programme qui se contente de faire une boucle sur les événements, qui gère l'action "QUIT" et qui ne fait qu'une seule chose : une instruction "SDL_Flip(screen);"

Le programme : 

```
SDL_Surface * screen;
SDL_Event event;
screen = SDL_GetVideoSurface();

int done = 0;
while (!done) {

    SDL_PollEvent(&event);
    switch (event.type) {
        case SDL_QUIT:
            done = 1;
            break;
    }

    SDL_Flip(screen);
}
```

Et bien ce programme fait monter l'utilisation de la mémoire en permanence d'après l'outil "MallocDebug". Dès que je mets la ligne SDL_Flip en commentaire, l'utilisation de la mémoire devient stable (comportement identique avec SDL_UpdateRect). 

L'augmentation de mémoire se compte en kilo-octets par secondes.

Savez-vous si c'est normal ? 
MallocDebug indique-t-il quelque chose de correct ?
SDL aurait des fuites de mémoire ? Si oui, il y a-t-il un moyen de les éviter, sachant que l'objectif est d'avoir un logiciel que je pourrais utiliser pendant plusieurs heures ?

A mon boulot, j'ai entendu dire qu'Unix utilisait de la nouvelle mémoire tant qu'il en a plutôt que de réutiliser celle qu'il libère et n'utilise celle-ci que quand toute la mémoire de l'ordinateur a déjà été utilisée. Est-ce vrai ? Dans ce cas, comment savoir quelle quantité de mémoire un programme utilise vraiment ?


----------



## tatouille (5 Mars 2011)

stop  ton caca avec la memoire et ce que tu ne comprends pas et lis la doc, la fuite mentale c'est toi

SDL_FreeSurface + ton code est debile, tu ne sais pas bien ce que fais, dis moi Jacky la 205 elle va bien? de plus j'imagine que tu fais ca dans le main thread hein Jacky ou alors tu ne le sais meme pas ce qui ne m'etonerait point vue le caca lu plus haut.......... non mais il faudrait commencer serieusement a couper des doights, as tu une idee de ce qu'est un looper et ce qu'est un message queue ou bien encore pire des functions  du type post(target, message);

et

message_handle(message_t *msg)
{
    case msg->what:
}

?

et bien sur ton looper holds a thread....... avec tout le systeme de synch qui va avec hein , ha bah oui c'est plus dur que de bricoler une 205.

pignolo quand les gens font un exemple d'un simple main avec un while ce la veut dire que tu as ton systeme de  message loops avec des loopers... ca veut dire en gros pas besoin de s'etendre tout le monde le sait, bah faudrait croire qu'ils y un certain nombre de faussaires dans ma profession.


----------

