2016-10-16 2 views
1
int *p=malloc(20); 

Maintenant, Heap alloue de la mémoire de 20 octets. Et renvoie l'adresse du 1er octet au pointeur P. (En supposant qu'aucun pointeur NULL n'est retourné).Malloc, Realloc, Libre

Maintenant je fais cela,

int *q=realloc(p, 40); 

Maintenant leur des possibilités suivantes:

1]. q = p

2]. q! = p

3]. q = NULL

oublié Possibilité 2 et 3.

Maintenant, j'écris:

free(p); 

maintenant Qu'est-ce qui va se passer?

Les 20 premiers octets deviendront-ils libres et le reste restera-t-il alloué ou tous les 40 octets seront-ils libérés ou quelque chose d'autre?

+2

Si 'realloc' renvoie un pointeur non nul, le pointeur transmis est invalidé (ie' free'd), vous n'avez pas besoin de le faire vous-même. – tkausl

+2

Il va libérer les 40 octets. Il arrive juste qu'il n'ait pas besoin de déplacer quoi que ce soit dans la réallocation –

+1

Si 'q == p' cela ne fait aucune différence que vous passez à' free', qui n'a aucune idée de la variable que vous avez utilisée, seulement de sa valeur. Mais ce serait une mauvaise pratique, je considère que c'est une question académique. –

Répondre

5

L'appel à libérer entraînera un comportement indéfini. Voici le raisonnement:

La fonction realloc va libérer le pointeur d'espace à par le pointeur p.

La durée de vie d'un objet, pointé vers, se termine à la désallocation.

La fonction free reçoit un pointeur vers l'espace désalloué et provoque un comportement indéfini .

De plus, la valeur du pointeur p après l'appel de réallocation est indéterminée et son utilisation peut entraîner un comportement indéfini dû aux représentations de déroutement. En d'autres termes, même si le pointeur renvoyé par realloc pointe au début du même espace que le pointeur p, l'objet alloué par realloc compte comme un nouvel objet avec une nouvelle durée de vie et ne peut pas être désalloué en utilisant le pointeur p.


(cité à partir de: ISO/IEC 9899: 201x 7.22.3.5 La fonction realloc 2)
La fonction realloc libère l'ancien objet pointé par ptr et renvoie un pointeur à un nouvel objet qui a la taille spécifiée par taille.

(cité à partir de: ISO/IEC 9899: 201x 7.22.3 fonctions de gestion de mémoire 1)
La durée de vie d'un objet alloué étend à partir de la répartition jusqu'à ce que la désallocation

(cité de: ISO/CEI 9899: 201x 7.22.3.3 La fonction libre 2)
Sinon, si l'argument ne correspond pas à un pointeur précédemment renvoyé par une fonction de gestion de la mémoire , ou si l'espace a été désalloué par un appel à free ou realloc, le comportement est indéfini.

(cité à partir de: ISO/IEC 9899: 201x 6.2.4 Durée de stockage d'objets 2)
La valeur d'un pointeur devient indéterminée lorsque l'objet qu'il pointe vers (ou juste après) atteint l'extrémité de sa vie.

0

De malloc/homme realloc Page

La fonction realloc() tente de changer la taille de l'allocation pointée par ptr à la taille, et retourne PTR. S'il n'y a pas assez pièce pour agrandir l'allocation de mémoire pointée par ptr, realloc() crée une nouvelle allocation, copie autant des anciennes données pointées par ptr que s'adapter à la nouvelle allocation, libère l'ancienne allocation, et renvoie un pointeur vers la mémoire allouée.

Vous devriez jeter un oeil sur la façon dont malloc(), free() et realloc() œuvres. Le moyen le plus simple est avec une implémentation simple.

http://arjunsreedharan.org/post/148675821737/write-a-simple-memory-allocator

+0

Les pages de manuel linux décrivent généralement le comportement de la mise en œuvre des fonctions sur les systèmes Linux, qui peut différer de la spécification Standard C et du comportement sur d'autres plates-formes. –

-2

realloc (p, new_size) redimensionner le bloc de mémoire désigné par p qui a été précédemment attribué à un appel à malloc ou calloc. maintenant si la mémoire est disponible adjacente à la mémoire allouée précédemment, elle renvoie le même pointeur que nous lui passons comme ici p donc dans ce cas si vous libérez (q) l'espace vers lequel les deux p & pointent seront supprimés .

mais si la mémoire est disponible à côté de la mémoire allouée précédemment alors il retourne différent pointeur pour l'espace nouvellement alloué dans ce cas si vous libérerez (q) l'espace nouvellement alloué sera supprimé

dans les deux mémoire cas est supprimé 40 bits