Que se passe-t-il si je réattribue et que la nouvelle taille est 0.Est-ce équivalent à un gratuit ?

StackOverflow https://stackoverflow.com/questions/2546572

  •  23-09-2019
  •  | 
  •  

Question

Étant donné le code suivant :

int *a = NULL;
a = calloc(1, sizeof(*a));
printf("%d\n", a);
a = realloc(a, 0);

printf("%d\n", a);
return (0);

Il renvoie :

4078904
0

Cette réallocation équivaut-elle à un free ?

NOTE:J'utilise MinGW sous WindowsXP.

Était-ce utile?

La solution

Pas nécessairement.

Cela fait souvent comme avec le lien posté par munissor, mais la page de manuel de Mac OS 10.5 dit :

Si size est zéro et que ptr n'est pas NULL, un nouvel objet de taille minimale est alloué et l'objet d'origine est libéré.

Qu'est-ce qu'un « objet de taille minimale » ?Eh bien, tout allocateur stocke des informations sur les allocations, ce qui occupe de l'espace qui est souvent alloué en plus de l'espace réservé à l'utilisateur.Vraisemblablement, un "objet de taille minimale" n'est qu'un de ces en-têtes plus zéro octet d'espace réservé à l'utilisateur.

Je suppose que cette disposition est présente pour prendre en charge les implémentations qui existaient au moment de la normalisation et que ces implémentations sont utiles pour déboguer le comportement d'allocation.


Adresser Les commentaires de Jonathan

Considérez la différence entre

for (int i=0; i<VERY_BIG_NUMBER; ++i){
  char *p = malloc(sizeof(char[10]));
  free(p);
}

et

for (int i=0; i<VERY_BIG_NUMBER; ++i){
  char *p = malloc(sizeof(char[10]));
  realloc(p,0);
}

Avec une mise en œuvre saine de malloc et free le premier clip le fait pas consommer de la mémoire sans limite.Mais si le realloc l'implémentation renvoie les "objets de taille minimale" qu'elle pourrait.

Certes, cet exemple est artificiel et repose sur la compréhension de ce que l'on entend par "objet de taille minimale", mais je pense que le texte le permet.

Bref, si vous signifier free tu devrais dire free.

Autres conseils

Il peut ou peut ne pas être équivalent à appeler free sur le pointeur; le résultat est défini par l'implémentation.

De la norme C99 (§7.20.3 / 1):

  

Si la taille de l'espace est zéro, le comportement est défini par l'implémentation: soit un pointeur NULL est renvoyé, ou le comportement est comme si la taille était une valeur non nulle, sauf que le pointeur retourné ne doit pas être utilisé pour accéder à un objet.

Cela vaut pour toutes les fonctions de gestion de la mémoire, y compris realloc.

Oui

La norme C99 §7.20.3.4 (realloc) dit:

  

La fonction realloc désalloue l'ancien objet pointé par ptr et renvoie une   pointeur vers un objet qui a la taille spécifiée par la taille. Le contenu du nouveau   objet est identique à celui de l'ancien objet avant DEALLOCATION, jusqu'à la moindre des   les nouveaux et les anciens formats. Tous les octets dans le nouvel objet au-delà de la taille de l'objet ancien ont   des valeurs indéterminées.

     

Si ptr est un pointeur NULL, la fonction realloc se comporte comme la fonction malloc pour la   taille spécifiée. Dans le cas contraire, si PTR ne correspond pas à un pointeur plus tôt retourné par la   calloc, fonction malloc ou realloc, ou si l'espace a été désallouée par un appel   à la fonction libre ou realloc, le comportement est indéfini. Si la mémoire du nouveau   objet ne peut pas être attribué, l'ancien objet n'est pas désallouée et sa valeur ne change pas.

indique clairement que l'ancien objet est désalloué (libéré). La valeur de retour est peut-être un pointeur nul, ou peut-être une valeur telle que spécifiée dans les notes générales pour §7.20.3:

  

Si la taille de l'espace est zéro, le comportement est défini par l'implémentation:   soit un pointeur nul est retourné, ou le comportement est que si la taille était quelque   valeur non nulle, sauf que le pointeur retourné ne doit pas être utilisé pour accéder à un objet.

De toute façon, vous ne pouvez pas déréférencer la valeur retournée. Il pourrait être utilisé comme argument pour free(), ou transmis à d'autres fonctions aussi longtemps que leur tour ne référencent pas

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top