Question

  

Si la zone pointée était déplacée, une   libre (PTR) est fait.

Pouvez-vous s'il vous plaît expliquer la ligne ci-dessus à propos realloc()? Cette ligne est une page de manuel pour calloc, malloc, realloc et libre.

Était-ce utile?

La solution

Je pense que cela explique mieux:

  

Si suffisamment d'espace n'existe pas   développer dans le bloc actuel de son   emplacement actuel, un nouveau bloc de la   la taille de la dimension est attribuée, et   les données existantes sont copiées de l'ancien   bloquer au début de la nouvelle   bloquer. Le vieux bloc est libéré, et   fonction retourne un pointeur vers la nouvelle   bloc.

realloc en C

Autres conseils

Disons que vous avez les mises en tas suivants. Ceci est un allocateur de mémoire simplifiée où aucun espace est repris dans le tas par des informations de commande

Addr       A                   B
     +------------+      +------------+
1000 | your space |      | your space |
     +------------+      +------------+
2000 | free space |      | used space |          
     |            |      +------------+
3000 |            |      | free space |
     |            |      |            |
4000 |            |      |            |
     +------------+      +------------+

Dans les deux cas, vous avez 1000 octets alloués à l'adresse 1000. Toutefois, dans la situation B, cela est immédiatement suivi par la mémoire allouée à d'autres fins.

Examinons ce qui se passe quand vous voulez réallouer votre mémoire à 2000 octets.

Dans la situation A, cela est facile, il élargit simplement votre allocation selon le schéma ci-dessous.

Mais, dans la situation B, ce n'est pas si facile. La mémoire immédiatement après votre bloc est utilisé donc il n'y a pas assez de place pour étendre simplement votre allocation, et vous besoin mémoire consécutive. Voici la position finale pour les deux situations:

Addr       A                   B
     +------------+      +------------+
1000 | your space |      | free space |
     |            |      +------------+
2000 |            |      | used space |
     +------------+      +------------+
3000 | free space |      | your space |
     |            |      |            |
4000 |            |      |            |
     +------------+      +------------+

Pour la situation B, l'allocateur trouve un bloc (à 3000) que assez grand pour votre expansion désirée et copie le contenu de votre bloc en cours (à 1000) à elle. Ensuite, il vous donne l'adresse de ce nouveau bloc et libère l'ancien bloc puisque ce n'est plus requis par vous. C'est ce que l'expression de votre question signifie.

Cette action de tampons en mouvement dépend autour de la stratégie d'allocation de mémoire, mais, en général, un tampon ne sera pas déplacé (il est souvent coûteux car il implique une copie de mémoire de masse) si:

  • il y a un espace libre après que, en même temps que l'espace actuel, peut satisfaire la réaffectation; ou
  • vous réduisez la taille.

Vous ne pouvez toujours développer la zone de mémoire in situ. Il ne peut y avoir place dans le tas. Ainsi, au lieu de plus en plus, il attribuera un tout nouveau bloc de mémoire et libérer la vieille mémoire.

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