8
votes

Que se passe-t-il lorsque j'ai essayé de libérer la mémoire allouée par Heap Manager, qui alloue plus que demandé?

Cette question m'a été posée dans une interview.

Supposons que CHAR * P = MALLOC (N) attribue plus de N, Say n octets de mémoire sont alloués et libres (P) sont utilisés pour libérer la mémoire allouée à p.

Le gestionnaire de tas peut-il effectuer une telle allocation défectueuse? Que se passe-t-il maintenant, n octets seront libérés ou n octets sont libérés?

Y a-t-il une méthode pour trouver la quantité de mémoire libérée?

Modifier

existe-t-il une méthode pour trouver la quantité de mémoire libérée?

mieux que rien,

Mallinfo () peut perdre une lumière comme indiqué par "Fred Larson"


1 commentaires

Pourquoi pensez-vous qu'une telle allocation est défectueuse? Quel que soit le nombre de "code" réels " masloc () alloué, vous pouvez utiliser uniquement n octets et gratuit () libérera tous les octets alloués. La plupart des MALLOC Les implémentations allouent plus d'espace, puis demandées pour des raisons d'efficacité. Une implémentation définit malloc et libres et par définition, ils doivent être d'accord sur un schéma d'attribution.


5 Réponses :


4
votes

Oui, le gestionnaire de tas est autorisé à renvoyer un bloc de plus de n octets. Il est totalement sûr (et requis!) Pour libérer le pointeur retourné à l'aide de GRATUIT et Gratuit

De nombreux implémentations de tas suivent leurs allocations en insérant des blocs de métadonnées dans le tas. GRATUIT recherchera que les métadonnées déterminent la quantité de mémoire à distribuer. Ceci est spécifique à la mise en œuvre, cependant, il n'ya donc aucun moyen de savoir combien malloc vous a donné, et généralement, vous ne devriez pas vous en soucier.


0 commentaires

8
votes

Oui, c'est ce qui se passe presque chaque fois que vous avez un malloc () . L'en-tête de bloc MALLOC contient des informations sur la taille du bloc, et lorsque gratuit () est appelé, il renvoie ce montant en arrière. Ce n'est pas défectueux, il est attendu opérationnelle.

Une simple mise en œuvre peut, par exemple, stocker uniquement la taille du bloc dans l'espace précédant immédiatement le pointeur retourné. Ensuite, gratuit () ressemblerait à ceci comme suit: xxx

retour_to_heap () est utilisé ici pour signifier un fonction qui fait le travail réel de renvoyer le bloc de mémoire spécifié au tas pour une utilisation future.


5 commentaires

Existe-t-il une méthode pour savoir combien de mémoire est libérée?


@rozuur: toute la mémoire allouée par MALLOC () sera libéré par gratuit () . Je pense que votre vraie question est de savoir comment savoir la quantité de mémoire allouée. (Et la réponse? Au moins autant que l'on a demandé si l'allocation a été réussie.)


Rozuur: Regardez sur cette page: msdn.microsoft.com/ EN-US / Bibliothèque / MS220938 (vs.80) .aspx Cela donne une idée de ce qui est réellement fait lorsque vous demandez un morceau de mémoire. La plupart des implémentations sont très similaires à celles-ci.


@rozuur Le point important est que ce n'est pas la matière quelle est la taille de l'allocation. Ce sont des détails de la mise en œuvre et vous ne devriez pas trop m'inquiéter d'eux, sauf si vous soupçonnez qu'ils vous causent des problèmes, que la plupart du temps ils ne le feront pas.


@Rozur, et pour la postérité! 1) Toute la mémoire Allocation sera publiée ( n , selon la question). 2) Que vous puissiez rechercher ou non la quantité de mémoire allouée dépend de la publication de la question de savoir si le gestionnaire de mémoire publie ces informations. 3) Il n'y a pas de fonction standard pour obtenir le nombre d'octets alloués par malloc () (bien que différents fournisseurs puissent choisir de fournir une telle fonction). 4) De nombreux gestionnaires de mémoire arrondi n à la puissance suivante de deux, garantissant ainsi que vous ne perdez jamais plus de la moitié de votre mémoire.



1
votes

Généralement, le gestionnaire de tas va libérer tout ce qu'il a alloué. Il stocke cette information quelque part et le regarde lorsque gratuit () est appelé.

Un gestionnaire de tas n'est pas "défectueux" si cela attribue plus de mémoire que celle demandée. Les gestionnaires de démarrage travaillent souvent avec des tailles de blocs fixes et s'élèveront à la taille de bloc appropriée suivante lorsqu'une demande satisfaisante. Le travail du gestionnaire de tas consiste à être aussi efficace que possible, et souvent de grandes gains d'efficacité résultent de quelques petites inefficiences.


1 commentaires

"Souvent, de grandes gains d'efficacité résultent de quelques petites inefficiences" belle citation 8 ^)



1
votes

Ceci est le comportement par défaut de malloc. Il retournera null ou un pointeur sur une section de la mémoire au moins aussi longtemps que celle que vous avez demandée. Donc, oui GRATUIT doit pouvoir gérer de plus longtemps que ce qui a été demandé.

Découvrez la quantité de mémoire libre ou allouée est une question spécifique à la plate-forme.


0 commentaires

1
votes

D'autres réponses ont bien expliqué comment la taille du bloc est traitée. Pour savoir combien de mémoire libérée, la seule solution à laquelle je peux penser est d'appeler mallinfo () avant et après le libre.


0 commentaires