Dupliqué possible: strong>
C Programmation: Comment libre savoir à quel point? p> blockQuote>
gratuit () code> est appelé pour annouez la mémoire allouée par
malloc () code> Appel de fonction. D'où est le
gratuit () code> trouve les informations sur le no. d'octets alloués par la fonction
malloc () code>. C'est-à-dire comment vous conformez-vous le non? d'octets alloués par le
masloc () code> et où se trouve cette information stockée. p>
-surya p>
4 Réponses :
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 () code> - par exemple, le bloc pourrait stocker le nombre d'octets au début et
Malloc () < / code> retournerait un pointeur offset. p>
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. P>
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: P>
L'adresse est ensuite donnée à vous est l'adresse de la zone de données. Ensuite, lorsque vous libérez le bloc, 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 sup> mais l'option Info de comptabilité intégrée est commune). p>
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). P>
a sup> J'ai écrit des implémentations de 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 gratuit code> 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>
Malloc code> 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. P>
MALLOC CODE> et
GRATUIT CODE> (pas besoin de fusionner des blocs gratuits adjacents), particulièrement important dans l'environnement que nous travaillions. P>
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: lorsque masloc () code> attribue la mémoire de la liste gratuite, il allouera
taille + Tailleof (Structure MalloCether) Code> et renvoie l'adresse de
DATA CODE>. Dans
gratuit () code>, le décalage de
DATA code> dans la structure
MalloCheader code> est soustrait du pointeur que vous transmettez puis connaît la taille. < / p> p>
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 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
Voir C Programmation: Comment libre savoir à quel point ?