Realloc qui ne fait pas changer la place de ptr dans la mémoire

Realloc qui ne fait pas changer la place de ptr dans la mémoire

by Benedek Hauer -
Number of replies: 1

Bonjour,

Sur la manpage de realloc, j'ai pu lire ceci:

void *realloc(void *ptr, size_t size);

"If  ptr  is  NULL,  then  the call is equivalent to malloc(size), for all values of size; if size is equal to zero, and ptr is not  NULL,  then  the  call  is equivalent to free(ptr).  Unless ptr is NULL, it must have been returned by an earlier call to  malloc(),  calloc(),  or realloc().  If the area pointed to was moved, a free(ptr) is done."

Ma question est: que se passe-t-il si l'on diminue la taille allouée dans realloc (p. ex. de 10 int à 5 int), et que l'endroit dans la mémoire ne change pas de place (càd que ptr pointera toujours sur le premier int des 10) ? Est-ce possible? Si oui, cela ne causerait pas une fuite (comme il n'y a pas de free et qu'on diminue la taille de 5 éléments)?

Merci d'avance!

In reply to Benedek Hauer

Re: Realloc qui ne fait pas changer la place de ptr dans la mémoire

by Marc Bernard René Gay-Balmaz -

Bonjour,

Oui c'est tout à fait possible et même très probablement ce qui va arriver quand on diminue la taille allouée. 

Et pour la question de la fuite mémoire, non, ça ne crée pas de fuite mémoire, la mémoire réduite est free, si on veut, en cela que la mémoire allouée l'est en écrivant un en-tête dans la mémoire contenant la taille de la mémoire allouée et donc les zones mémoire qui n'ont pas cet en-tête (en général ils en ont un très similaire mais avec un pointeur vers la prochaine zone libre) sont des zones mémoire libres. Une fuite mémoire se produit quand on laisse un en-tête dans la mémoire mais qu'on perd son adresse (dans ce cas, on ne peut plus le supprimer et le système ne sait pas quelles zones mémoire sont accessibles). Et dans le cas où on réduit la taille de la zone allouée, on modifie la taille de la zone dans l'en-tête et la zone suivante est donc considérée comme libre (et en général on va aussi créer un en-tête dans la zone libérée pour qu'il soit conforme).

Je précise juste que cette manière d'allouer de la mémoire est une manière de faire mais il en existe sûrement d'autres.

Et juste pour que ce soit bien claire, il n'est pas nécessaire que vous sachiez tout ça, juste comment utiliser l'interface, et donc dans le cas présent que réduire une taille avec un realloc ne crée pas de fuite mémoire 

En espérant que ça aide