154 votes

C ++, Free-Store vs Heap

Des allocations dynamiques avec new/delete auraient lieu sur le free-store ,
tandis que malloc/free opérations utilisent le tas .

J'aimerais savoir s'il y a une différence réelle dans la pratique.
Les compilateurs font-ils une distinction entre les deux termes? ( Magasin gratuit et tas , pas new/malloc )

97voto

Copperpot Points 197

Pour C++, la différence entre la boutique et le tas est devenu purement conceptuel. Comme un pot pour la collecte de bugs, et un pour la collecte des cookies. L'un est marqué d'une manière, l'autre d'une autre. Cette désignation est destinée à conduire à la maison le point que vous ne mélangez JAMAIS des "nouveaux" et "supprimer" avec "malloc", "realloc", ou "libre" (ou à peu des ensembles de niveau d'ailleurs).

Lors d'entrevues, il est bon de dire que le "new et delete utiliser le free store, malloc et free utiliser le tas; new et delete appeler le constructeur et le destructeur, respectivement, cependant malloc et free ne le font pas." Pourtant, vous entendrez souvent que les segments de mémoire sont vraiment dans la même zone, cependant, qui PEUVENT être spécifiques de compilateur, c'est-à-dire, il est possible que les deux peuvent désigner les différents espaces de mémoire piscines (je ne sais pas pourquoi il serait, cependant).

92voto

Michael Koval Points 3597

Voir http://www.gotw.ca/gotw/009.htm; il est possible de décrire les différences entre le tas et le libre-magasin de loin mieux que je le pouvais:

Gratuit-magasin:

Le magasin gratuit est l'un des deux dynamique de la mémoire zones affectées ou libéré par new/delete. Durée de vie des objets peut être de moins que le temps de stockage est alloués; c'est, gratuit stocker des objets peut avoir de la mémoire allouée sans étant immédiatement initialisé, et peut être détruit sans que la mémoire immédiatement libéré. Au cours de la période où le stockage est alloué mais en dehors de l'objet de la durée de vie, la le stockage peut être consulté et manipulé par un void*, mais aucun de la proto-objet non statiques les membres de la ou des fonctions de membre peut être consulté, ont leurs adresses prises, ou être manipulés.

Tas:

Le tas est la dynamique de la mémoire zone allouée/libéré par malloc/free et de leurs variantes. Note que bien que la valeur par défaut global new et delete pourrait être mise en œuvre en termes de malloc et free par un particulier compilateur, le tas n'est pas le même que free store et de la mémoire allouée dans un la zone ne peut être en toute sécurité libérés dans l'autre. La mémoire allouée à partir de la tas peut être utilisé pour les objets de la classe type de placement-nouvelle construction et explicite de la destruction. Si on les utilise, les notes sur free store durée de vie des objets appliquer de la même façon ici.

37voto

Crashworks Points 22920

Mike Koval réponse du couvre la théorie assez bien. Dans la pratique, cependant, ils sont presque toujours de la même région de la mémoire -- dans la plupart des cas, si vous creusez dans l'implémentation du compilateur d' new,, vous trouverez qu'il appelle malloc().

En d'autres termes: à partir de la machine point de vue, et de tas gratuit store sont la même chose. La distinction qui existe à l'intérieur du compilateur.

Pour rendre les choses encore plus confuses, avant l'avènement de C++, nous avons dit "en tas", pour signifier ce qui est maintenant appelé "free store."

7voto

Jim Lewis Points 18753

Le terme "heap" peut également faire référence à une structure de données particulière, mais dans le contexte des opérations malloc, free, new et delete de C ++, les termes "heap" et "free store" sont utilisés de manière plus ou moins interchangeable.

4voto

avakar Points 20031

Je ne me souviens pas que la norme mentionne jamais le mot tas, sauf dans les descriptions de fonctions de tas telles que push_heap et al. Toutes les allocations dynamiques sont effectuées sur le free-store.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X