Fuite mémoire, que libérer ? [Résolu] - API Win32 - Programmation
Marsh Posté le 02-09-2009 à 15:54:25
Peut-être que ce serait dû à l'ordre des libérations des ressources. Essayer de les faire dans l'ordre inverse de leur création, en remplaçant les lignes 37 à 39 par :
DeleteObject(hNewBitmap); |
Marsh Posté le 02-09-2009 à 16:16:33
Autre chose.
BITMAP take_screenshot() |
La ligne BITMAP bm;réserve de l'espace sur la pile pour la structure bm, par exemple à l'adresse 1234.
La ligne return bm renvoie 1234, mais ne renvoie pas le contenu de la structure.
La ligne BITMAP bm = take_screenshot();associe 1234 au nouveau bm
Ensuite la pile est altérée par la suite du programme, ce qui est normale, et donc les octect à l'adresse 1234 ne veulent plus rien dire.
Pour le passage de paramètres, il faut procéder autrement. Il faut les mettre dans les paramètres de la fonction, et non pas dans le pointeur de retour d'une fonction, et il ne faut pas les allouer à l'intérieur d'une sous fonction, mais les allouer à l'extérieur, et donc écrire :
int take_screenshot(... BITMAP bm ...) |
Marsh Posté le 02-09-2009 à 16:18:09
Hmm, il y a un truc qui me parait être la cause, c'est ton premier appel à SelectObject, ça devrait plutôt être :
Code :
|
Et avant de libérer ton DC, il faut toujours remettre les valeurs d'origine avec GDI :
Code :
|
Et ton hNewBitmap ne sert à rien, ton second appel à SelectObject va te renvoyer un pointeur sur hCaptureBitmap.
Edit: oh purée, je n'avais pas vu ton "DeleteObject(&bm);" à la fin. Incroyable que ça ne fasse pas planter ton programme. &bm n'est pas du tout un handle de bitmap, fait simplement un "delete[] bm.bmBits".
Edit2: purée et tu fais un reinterpret_cast sur bm.bmBits dans un uint8_t *, que tu passes à la fonction free(), apràs l'avoir alloué avec new char[x].
Marsh Posté le 02-09-2009 à 16:50:45
Merci bien, avec toute ces modifs ça fonctionne bien mieux.
Marsh Posté le 02-09-2009 à 14:41:50
Bonjour,
Je dois avoir du mal pour libérer mes structs, pointeurs et autre parce que mon programme a de grosse fuite mémoire (quelques giga en quelques secondes). Je crois avoir isoler le probleme dans ces deux fonctions, pouvez vous m'aider a me montrer ce que j'ai oublié de libérer et comment les libérer.
Merci !
Message édité par kyom le 02-09-2009 à 16:51:53