2010-02-21 5 views
4

J'essaye de libérer la mémoire que j'ai allouée avec malloc, mais la commande free ne semble pas faire son travail correctement selon le débogueur d'Eclipse. Comment est-ce possible? Ci-dessous est une capture d'écran de mon débogueur après qu'il soi-disant libéré seCurrent->student->year, ce qui n'est clairement pas le cas. year a été allouée en utilisant malloc.free() ne libère pas la mémoire correctement?

alt text http://img693.imageshack.us/img693/7840/codeo.png

Répondre

12

free() ne change pas normalement toutes les valeurs de votre programme - il est tout simplement des ajustements sur le tas d'exécution C. Cela signifie que les valeurs de la mémoire qui vient d'être libérée sont conservées. Cependant, les tentatives d'accès à partir de votre code entraînent un comportement indéfini.

+1

Recommanderiez-vous d'utiliser le pointeur NULL après avoir libéré le pointeur? – Pieter

+0

@Pieter Définir à quelque chose d'invalide, reconnaissable par un humain comme invalide, et non accepté par 'free'. La norme dit que 'free' est supposé accepter' NULL', donc vous pouvez cacher un double-freeing-bug si vous mettez le pointeur sur NULL. –

+0

Par contre, si vous placez le pointeur sur NULL et que vous le libérez à nouveau, est-ce vraiment un bug? – bk1e

7

Qu'est-ce qui vous fait penser qu'il ne l'a pas libéré? Libérer de la mémoire signifie que l'accès à partir du programme par la suite est un comportement non défini, et la mémoire est disponible pour réutilisation la prochaine fois que vous appelez malloc. Il ne promet pas d'écraser les données stockées dans la mémoire que vous avez libérée, ni d'empêcher le débogueur de lire la mémoire non allouée.

5

Free retournera l'espace alloué au tas pour être réutilisé par les mallocs suivants, mais ne changera pas les valeurs des pointeurs qui ont précédemment référencé cette mémoire. Dans votre cas, aucun autre malloc n'a encore été exécuté, donc la mémoire qui vient d'être libérée est toujours la même que juste avant l'appel à libérer. Pour que votre code sache qu'il n'y a plus de données associées au pointeur, vous pouvez le définir sur null après avoir libéré la mémoire qui lui est associée.

0

Lorsque vous malloc() de la mémoire, tout ce qu'il fait est de chercher de l'espace libre dans la mémoire, et de garder la trace, il est maintenant utilisé. Il ne l'initialise pas ou quoi que ce soit.

lorsque vous appelez free(), tout ce qu'il fait est de compensation de ce bloc de mémoire sur la liste des blocs de mémoire utilisés. Encore une fois, cela ne modifie pas le contenu.

Questions connexes