Qu'est-ce qu'un tas de mémoire?


Réponses:


234

Vraisemblablement, tu veux dire tas du point de vue de l'allocation de mémoire, pas du point de vue de la structure de données (le terme a plusieurs significations).

Une explication très simple est que le tas est la partie de la mémoire où réside la mémoire allouée dynamiquement (c'est-à-dire la mémoire allouée via malloc). La mémoire allouée à partir du tas restera allouée jusqu'à ce que l'un des événements suivants se produise:

  1. La mémoire est free 'd
  2. Le programme se termine

Si toutes les références à la mémoire allouée sont perdues (par exemple, vous ne stockez plus de pointeur vers elle), vous avez ce que l'on appelle une fuite de mémoire . C'est là que la mémoire a encore été allouée, mais vous n'avez plus de moyen facile d'y accéder. La mémoire perdue ne peut pas être récupérée pour de futures allocations de mémoire, mais lorsque le programme se termine, la mémoire sera libérée par le système d'exploitation.

Comparez cela avec la mémoire de pile qui est l'endroit où vivent les variables locales (celles définies dans une méthode). La mémoire allouée sur la pile ne vit généralement que jusqu'au retour de la fonction (il y a quelques exceptions à cela, par exemple des variables locales statiques).

Vous pouvez trouver plus d'informations sur le tas dans cet article .


3
Comment les variables locales pourraient-elles vivre dans une pile? Une pile ne permet de prendre qu'une variable à la fois dans un ordre très précis. Et si j'ai besoin d'une variable locale d'un endroit plus bas sur la pile?
CodyBugstein

9
@Imray - dans un langage à typage statique, les tailles des paramètres locaux sont connues au moment de la compilation. Par conséquent, les variables locales sont simplement accessibles directement depuis la pile via un décalage d'adresse. Il n'est pas nécessaire de faire sauter la pile pour ce faire. Voir cette réponse pour plus de détails.
LeopardSkinPillBoxHat

17

Un tas de mémoire est un emplacement en mémoire où la mémoire peut être allouée à un accès aléatoire.
Contrairement à la pile où la mémoire est allouée et libérée dans un ordre très défini, les éléments de données individuels alloués sur le tas sont généralement libérés de manière asynchrone les uns par rapport aux autres. Un tel élément de données est libéré lorsque le programme libère explicitement le pointeur correspondant, ce qui peut entraîner un tas fragmenté. Par opposition, seules les données du haut (ou du bas, selon le fonctionnement de la pile) peuvent être libérées, ce qui entraîne la libération de l'élément de données dans l'ordre inverse de l'allocation.


9

Le tas est juste une zone où la mémoire est allouée ou désallouée sans aucun ordre. Cela se produit lorsque l'on crée un objet en utilisant l' newopérateur ou quelque chose de similaire. Ceci est opposé à la pile où la mémoire est désallouée sur la base du premier entré-dernier sorti.


8

Un tas de mémoire est une structure courante pour contenir la mémoire allouée dynamiquement. Voir Dynamic_memory_allocation sur wikipedia.

Il existe d'autres structures, comme des piscines, des piles et des piles.


7

Il s'agit d'un morceau de mémoire alloué à partir du système d'exploitation par le gestionnaire de mémoire utilisé par un processus. Les appels à malloc()et autres prennent alors la mémoire de ce tas au lieu d'avoir à traiter directement avec le système d'exploitation.


7

Vous parlez probablement de mémoire de tas, pas de tas de mémoire.

La mémoire de tas est essentiellement un grand pool de mémoire (généralement par processus) à partir duquel le programme en cours d'exécution peut demander des blocs. Ceci est généralement appelé allocation dynamique .

Il est différent de la pile, où des «variables automatiques» sont allouées. Ainsi, par exemple, lorsque vous définissez dans une fonction C une variable de pointeur, suffisamment d'espace pour contenir une adresse mémoire est alloué sur la pile. Cependant, vous devrez souvent allouer dynamiquement de l'espace (avec malloc) sur le tas, puis fournir l'adresse où ce bloc de mémoire commence au pointeur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.