Une façon courante d'utiliser un tableau alloué par tas est:

SomeType * arr = new SomeType[15454];
//... somewhere else 
delete [] arr;

Pour faire delete [] arr, le runtime C doit connaître la longueur de la mémoire tampon associée au pointeur. Ai-je raison?

Donc, en principe, il devrait être possible d'accéder aux informations d'une manière ou d'une autre? Pourrait-il être consulté en utilisant une bibliothèque? Je me demande simplement. Je comprends que ce n'est pas une partie essentielle du langage, donc cela dépend de la plate-forme.

c++
9
Prokop Hapala 4 août 2017 à 13:06

2 réponses

Meilleure réponse

Vous avez raison. L'information est là. Mais il n'y a pas de moyen standard de l'obtenir.

Si vous utilisez Windows, il existe une méthode _msize(), qui peut vous donner la taille du bloc de mémoire, bien qu'elle ne soit pas nécessairement exacte. (La taille de bloc de mémoire indiquée peut être arrondie au point d'alignement supérieur le plus proche.) Voir MSDN - _msize

Si c'est quelque chose que vous devez vraiment avoir, vous pouvez tenter votre chance en écrasant new, en allouant un bloc de mémoire légèrement plus grand, en stockant sa taille au début et en renvoyant un pointeur vers l'octet après la taille. Ensuite, vous pouvez écrire votre propre msize() qui renvoie cette taille. Bien sûr, vous devrez également remplacer delete. Mais c'est trop compliqué et il vaut mieux l'éviter si vous le pouvez. Si vous allez de cette façon, vous ne trouverez que la douleur.

6
Mike Nakis 4 août 2017 à 10:18

La vérité est que delete[] ne connaît pas la taille exacte d'un tableau que vous avez alloué, mais il sait combien de mémoire a été allouée avec l'appel correspondant à new[]. Souvent, aucun excès de mémoire n'est alloué, donc les deux nombres correspondent. Cependant, vous ne pouvez pas vous y fier. Cela ne fait pas partie de la norme car il n'existe aucun moyen fiable de connaître la taille d'un tableau alloué dynamiquement.

-6
Volodymyr Lashko 4 août 2017 à 10:19