2009-10-08 10 views
1

Je sais que vous devez le faire comme ceci:Comment les tableaux alloués dynamiquement sont-ils libérés en C++?

int * p; 
p = new int[10]; 

//use array 

delete [] p; 

Maintenant, ma question est la suivante: Puisqu'il est pas explicitement indiqué, comment est-il possible que la bonne quantité de mémoire est libérée? L'OS garde-t-il la trace de la mémoire allouée et de son adresse de départ?

+1

dupliquer: http://stackoverflow.com/questions/197675/how-does-delete-know-the-size-of-the-operand-array –

Répondre

2

La bibliothèque d'exécution gardera trace des blocs de mémoire alloués. Il est garanti de libérer le bloc correctement, étant donné le pointeur initial retourné par new.

Bien que ce peut être implémenté dans l'OS lui-même (théoriquement), il ne l'est normalement pas. Ce que l'OS garde en mémoire, ce sont les pages allouées à un processus dans son ensemble, et non les blocs individuels alloués à ce niveau d'abstraction.

5

Oui, le système d'exploitation (ou plus probablement, la bibliothèque) conserve la trace. Lorsque vous allouez de la mémoire, le système d'exploitation crée un petit en-tête dans votre mémoire, généralement juste avant la mémoire allouée, c'est-à-dire à une adresse légèrement inférieure de quelques octets. Quand il libère de la mémoire, il prend le pointeur qui est libéré, remonte de quelques octets et vérifie la structure qui décrit ce qui a été réellement alloué, y compris la taille de ce qui a été alloué.

+0

C'est une façon de le faire. –

1

Il dépend complètement de l'implémentation. Tout comme malloc()/free(), il doit y avoir des informations supplémentaires sauvegardées par le système comme vous l'avez mentionné. En général, l'appel à malloc() ou au nouvel opérateur établit une structure d'en-tête en mémoire juste avant le pointeur qu'il vous renvoie, de sorte que plus tard, quand free() ou l'opérateur delete est appelé, il peut trouver quoi de neuf avec le bloc de mémoire que vous lui avez donné.

0

Cela dépend de la mise en œuvre, mais je pense que la bibliothèque d'exécution utilise un certain type de tables d'allocation de mémoire pour garder une trace des blocs alloués.