11
votes

Est-ce que Realloc Déplacer le pointeur si une nouvelle taille plus petite?

Je me demande si la norme C ou C ++ garantit qu'un pointeur n'est pas modifié lorsque Realloc s'appelle avec une taille réel (non nulle): xxx

essentiellement, le système d'exploitation peut-il décider de son Posséder que depuis que nous avons libéré un grand bloc de mémoire, il souhaite profiter de tous les réallocs pour défragmenter la mémoire et déplacer en quelque sorte PTR2?


0 commentaires

6 Réponses :


6
votes

avec realloc , vous n'êtes absolument pas de garanties sur l'endroit où la mémoire vivra des mots de mémoire. Je crois que le MALLOC par défaut de Libc ne copiera que de la mémoire de la mémoire, donc de manière pratique que vous puissiez être ok. Mais ne comptez pas dessus.


0 commentaires




4
votes

realloc n'est pas obligé de laisser le bloc en place même s'il convient, et en fait, l'implémentation de stud la plus simple est un exemple où elle pourrait ne pas:

  • malloc : appel sbrk .
  • realloc : appel malloc et memcpy .
  • gratuit : no-op.

    Cela peut sembler ridicule, mais parfois pour des systèmes embarqués, une implémentation comme je viens de décrire est en réalité optimale.


2 commentaires

Un autre exemple est une implémentation dans laquelle toutes les allocations adjacentes sont des blocages de la même taille afin d'éviter la fragmentation. Dans ce cas, un bloc de 32 octets n'appartient plus au même endroit que l'ancien bloc de 4096 octets.


Oui. Un autre exemple plus avancé serait une implémentation qui examine si le voisin de gauche du bloc à rétréser est libre, qu'il s'agisse d'un bloc libre significatif soient créés à droite en rétrécissant, que la taille résultante soit "assez petite "Que memcpy n'est pas trop cher ... et si les bonnes conditions sont remplies, déplace le bloc vers un nouvel emplacement pour éviter la fragmentation.



3
votes

Il me semble que toutes les réponses actuelles (au moment de cette réponse) ne font référence à aucun document standard.

pour C ++ je ferai référence à < EM> Projet de travail, Standard pour la programmation Language C ++ , Numéro de document: N3337, Date: 2012-01-16, révise: N3291 qui, selon https://isocpp.org/std/the-tandard est le document gratuit le plus proche du document standard officiel non libre C ++ 11 ; Nous trouvons ici la bibliothèque 20.6.13 C :

2 Le contenu est identique à l'en-tête Standard C Bibliothèque, avec les modifications suivantes: [À mon avis, les modifications énumérées ne sont pas pertinentes pour la Question].

Alors maintenant, nous devons nous référer à la norme C.

Selon https://stackoverflow.com/a/83763/15485 le document libre le plus proche de la non- Le document Standard C11 officiel gratuit est Langues de programmation - C , projet de comité N1570 - 12 avril 2011 ISO / CEI 9899: 201X ; Nous trouvons ici 7.22.3.5 la fonction Realloc :

4 La fonction Realloc renvoie un pointeur sur le nouvel objet ( lequel peut avoir la même valeur qu'un pointeur sur l'ancien objet ), ou un null pointeur si le nouvel objet n'a pas pu être attribué.

Je ne suis pas un orienté anglais indigène et vous devez donc interpréter le sens de "peut avoir".


1 commentaires

Je suis un locuteur anglais natif (et bien familier avec la norme C). Le texte cité indique que le nouveau pointeur peut avoir la même valeur que l'ancien pointeur, sans aucune implication que cela dépend de la taille. Une justification (non indiquée dans la norme) est qu'une implémentation pourrait affecter un plus petit morceau dans un endroit différent pour réduire la fragmentation et rendre les allocations futures plus susceptibles de réussir. Pour qu'il y ait une garantie qu'il n'est pas déplacé dans certains cas, cela devrait être indiqué explicitement dans la norme. Ce n'est pas le cas.