Est-il possible de trouver la mémoire allouée au pointeur, sans chercher l'instruction malloc?
Supposons que j'ai la mémoire allouée à certains pointeur dans une fonction foo
:
void foo()
{
//...
int *ptr = malloc(20*sizeof(int));
bar (ptr);
}
De foo()
je passe de ce pointeur pour bar()
et disons de bar()
à une autre fonction.
Maintenant, à un certain moment, je veux vérifier: de Combien de mémoire a été allouée pour le pointeur.
Est-il possible, sans chercher pour l'instruction:
int *ptr = malloc(20*sizeof(int));
pour comprendre combien la mémoire est allouée pour le pointeur, l'utilisation de GDB?
Grâce.
source d'informationauteur Sandeep Singh
Vous devez vous connecter pour publier un commentaire.
La réponse est: il dépend.
De nombreux systèmes de fournir
msize()
[1],malloc_usable_size()
[2], ou fonction similaire. Si vous êtes sur un tel système,(gdb) print malloc_usable_size(ptr)
est tout ce dont vous avez besoin.[1] http://msdn.microsoft.com/en-us/library/z2s077bc(v=vs. 80).aspx
[2] http://www.slac.stanford.edu/comp/unix/package/rtems/doc/html/libc/libc.info.malloc.html
En général, non. C n'offre pas un moyen pour obtenir la taille d'un bloc alloué de la mémoire. Vous avez besoin de garder une trace de la quantité de mémoire allouée vous-même.
MAISsur certaines librairies en C, il existe une fonction pour obtenir la taille utilisable d'un bloc de mémoire - malloc_usable_size (qui se trouve dans
<malloc.h>
sur les systèmes Linux, pas de page de manuel). Notez que cela ne fonctionne pas sur toutes les libcs, et peut indiquer une valeur supérieure à celle que vous avez demandé. S'il vous plaît, de les utiliser uniquement à des fins de débogage.Pour l'exhaustivité, ma réponse, qui plonge dans les bas-niveau de tas de métadonnées, avant @Employés russe, soulignant
malloc_usable_size
:MAISvous pouvez être en mesure d'extraire manuellement. Notez, cependant, que tout cela peut varier selon votre système d'exploitation, architecture des processeurs, et C de la bibliothèque. Je vais supposer que vous êtes à l'aide de eglibc 2.12.1; vos résultats peuvent varier de n'importe où ailleurs.
AVERTISSEMENT: Sérieusement, NE l'utilisez PAS, sauf à des fins de débogage dans gdb. Vraiment. Je veux dire, c'.
La glibc allocateur de mémoire stocke des morceaux de mémoire comme ça (sur un doc commentaire dans malloc/malloc.c):
Vos données " mem " ici, et la taille des morceaux inclut l'en-tête. L'indicateur P indique que la précédente-chunk de données est valide, et M indique c'est un mmap cartographie (pour les grandes mallocs). Tout cela n'est pas trop important; ce qui est important, c'est que la taille de la vie d'un pointeur de la taille de l'incrément avant de votre mémoire, vous avez juste à masquer les drapeaux et soustraire la taille d'en-tête:
Mise en garde: La taille allouée peut être plus grand que vous avez demandé. N'essayez pas d'obtenir intelligents et de l'utilisation de l'excédent. Demander combien vous avez besoin au début.
Mise en garde 2: Cela fonctionne uniquement avec la version de la glibc. Et il ne fonctionne qu'avec certaines versions de la glibc. et donc peut se briser à tout moment, sans avertissement. Je ne peux pas insister assez sur ce point; NE PAS l'utiliser dans votre code; uniquement pour le débogage lorsque vous avez épuisé toutes les autres options. Votre code doit garder la trace de ses tailles de tampon sur son propre.
Pas. Vous avez à stocker de l'information sur vous-même lorsque vous
malloc()
.