6
votes

Comment fonctionne gratuitement () collecter les informations sur le no. d'octets à libérer

Dupliqué possible:
C Programmation: Comment libre savoir à quel point?

gratuit () est appelé pour annouez la mémoire allouée par malloc () Appel de fonction. D'où est le gratuit () trouve les informations sur le no. d'octets alloués par la fonction malloc () . C'est-à-dire comment vous conformez-vous le non? d'octets alloués par le masloc () et où se trouve cette information stockée.

-surya


4 Réponses :


3
votes

Ceci est dépendant de la mise en œuvre. Le tas stocke ces données qui facilite l'accès à celui-ci ayant un pointeur renvoyé par Malloc () - par exemple, le bloc pourrait stocker le nombre d'octets au début et Malloc () < / code> retournerait un pointeur offset.


0 commentaires

8
votes

La plupart des implémentations de fonctions d'allocation de mémoire C stockeront des informations de comptabilité pour chaque bloc, en ligne ou séparément.

Une manière typique (Inline) consiste à affecter à la fois un en-tête et la mémoire que vous avez demandée, remanié à une taille minimale. Donc, par exemple, si vous avez demandé 20 octets, le système peut allouer un bloc de 48 octets:

  • en-tête de 16 octets contenant la taille, le marqueur spécial, la somme de contrôle, les pointeurs vers le bloc suivant / précédent, etc.
  • Zone de données de 32 octets (votre 20 octets est tombé sur un multiple de 16).

    L'adresse est ensuite donnée à vous est l'adresse de la zone de données. Ensuite, lorsque vous libérez le bloc, gratuit prendra simplement l'adresse que vous le donnez et, en supposant que vous n'ayez pas bourré cette adresse ou la mémoire qui l'entoure, vérifiez les informations de comptabilité immédiatement avant elle. < / p>

    Gardez à l'esprit la taille de l'en-tête et le rembourrage constitue une mise en œuvre totalement définie (en réalité, la mise en œuvre est définie sur la mise en œuvre a mais l'option Info de comptabilité intégrée est commune).

    Les checksums et les marqueurs spéciaux existants dans les informations comptables sont souvent la cause des erreurs telles que "la mémoire Arena corrompue" si vous les écrasez. Le rembourrage (pour faire une allocation plus efficace) est pourquoi vous pouvez parfois écrire un peu au-delà de la fin de votre espace demandé sans causer de problèmes (toujours, ce n'est pas un comportement indéfini et, juste parce que cela fonctionne parfois, t signifie que c'est bien de le faire).


    a J'ai écrit des implémentations de Malloc dans des systèmes embarqués où vous avez 128 octets, peu importe ce que vous avez demandé (c'était la taille de la plus grande structure de la système) et un simple masque bit non intégré a été utilisé pour décider si un morceau de 128 octets a été attribué ou non.

    Les autres que j'ai développées avaient des piscines différentes pour des morceaux de 16 octets, des morceaux de 64 octets, des morceaux de 256 octets et des morceaux de 1k, à nouveau à l'aide d'un point de bit pour réduire les frais généraux des informations comptables et augmenter la vitesse de MALLOC et GRATUIT (pas besoin de fusionner des blocs gratuits adjacents), particulièrement important dans l'environnement que nous travaillions.


0 commentaires

2
votes

Lorsque vous allouez un bloc de mémoire, plus d'octets que vous avez demandé sont alloués. Combien de temps dépend de la mise en œuvre, mais voici un exemple: xxx

lorsque masloc () attribue la mémoire de la liste gratuite, il allouera taille + Tailleof (Structure MalloCether) et renvoie l'adresse de DATA . Dans gratuit () , le décalage de DATA dans la structure MalloCheader est soustrait du pointeur que vous transmettez puis connaît la taille. < / p>


0 commentaires

0
votes

Ceci est dépendant de la mise en œuvre - Cela dépend de la mise en œuvre de la LIBC et de la mise en œuvre du système d'exploitation (plus sur la mise en œuvre du système d'exploitation).

Je n'ai pas besoin de savoir de telles choses, mais si vous voulez vraiment Vous pouvez créer votre propre Allocator mémoire . P>

Par erreur, j'ai découvert que dans C ++ lors de l'allocation avec Nouveau [] em> stocke le nombre d'éléments au début de la zone allouée de retour à l'utilisateur la zone Après fort> le nombre d'éléments (sur Visual Studio). P>

new[NUMBER] ---> [NUMBER (4bytes)]+[allocated area]
it returns the pointer to the allocated area
and probably when the delete[] operator is called
it looks 4 bytes before the [allocated area] to see
how much elements will be deleted


0 commentaires