Dans une implémentation typique, la taille du bloc de mémoire dynamique est en quelque sorte stockée dans le bloc lui-même - c'est vrai. Mais il n'y a pas de moyen standard pour accéder à cette information. (Les implémentations peuvent fournir des moyens spécifiques d'implémentation pour y accéder). C'est comme ça avec malloc/free
, c'est comme ça avec new[]/delete[]
.
En fait, dans une mise en œuvre typique des allocations de mémoire brute pour new[]/delete[]
appels sont finalement traités par une paire spécifique à la mise en œuvre malloc/free
-comme, ce qui signifie que delete[]
n'a pas vraiment se soucier de la quantité de mémoire à désaffecter: simplement appelle cela interne free
(ou quel que soit le nom), qui prend soin de cela.
Ce que delete[]
doit savoir, c'est combien d'éléments détruisent dans les situations où le type d'élément de tableau a un destructeur non trivial. Et c'est ce que votre question est sur - le nombre d'éléments de tableau, pas la taille du bloc (ces deux ne sont pas les mêmes, le bloc pourrait être plus grand que nécessaire pour le tableau lui-même). Pour cette raison, le nombre d'éléments dans le tableau est normalement également stocké à l'intérieur du bloc par new[]
et récupéré plus tard par delete[]
pour effectuer la destruction de l'élément de tableau approprié. Il n'y a pas de façon standard d'accéder à ce numéro non plus.
(ce qui signifie que dans le cas général, un bloc de mémoire typique allouée par new[]
sera indépendamment, stocker simultanément deux la taille de bloc physique en octets et le nombre d'élément de tableau. Ces valeurs sont stockées par différents niveaux de C++ mécanisme d'allocation de mémoire - allocateur de mémoire brute et new[]
respectivement - et n'interagissent pas les uns avec les autres de quelque façon que ce soit). Cependant, notez que pour les raisons ci-dessus, le nombre d'éléments de tableau n'est normalement stocké que lorsque le type d'élément de tableau a un destructeur non trivial. C'est à dire. ce compte n'est pas toujours présent. C'est l'une des raisons pour lesquelles il n'est pas possible de fournir un moyen standard d'accéder à ces données: vous devez toujours le stocker (ce qui gaspille de la mémoire) ou restreindre sa disponibilité par type de destructeur (ce qui prête à confusion).
Pour illustrer ce qui précède, lorsque vous créez un tableau de int
de
int *array = new int[100];
la taille du tableau (c.-à-100
) est pas normalement stockées par new[]
depuis delete[]
ne se soucie pas de ce (int
n'a pas de destructeur). La taille physique du bloc en octets (comme, 400 octets ou plus) est normalement stockée dans le bloc par l'allocateur de mémoire brute (et utilisé par la mémoire brute deallocator invoquée par delete[]
), mais il peut facilement s'avérer être 420 pour certains raison spécifique à la mise en œuvre. Donc, cette taille est fondamentalement inutile pour vous, car vous ne pourrez pas en déduire la taille exacte du tableau d'origine.
Un simple bon design n'a pas besoin de savoir - dans un cas complexe, vous devez faire vous-même beaucoup de gestion. Il y a généralement des fonctions de débogage pour votre compilateur qui vous le diront - mais si vous en avez besoin, votre design est probablement faux. –
Je me suis souvent demandé pourquoi vous ne voyez jamais un allocateur qui ne connaît pas la taille, et exige qu'il soit passé à la suppression. car combien de fois avez-vous déjà réussi à supprimer un bloc de mémoire et à ne pas pouvoir calculer facilement sa taille? Je suppose qu'il ne doit jamais avoir vraiment été un avantage à la mise en œuvre d'un système avec cette limitation ... – matt
Il serait probablement imposer des restrictions inutiles sur la mise en œuvre d'une telle opération de bas niveau. Après tout, vous saviez combien vous avez demandé quand vous avez alloué le tableau, donc il n'y a pas de besoin pressant de l'exécution pour pouvoir vous le dire. – UncleBens