Vérifier si quelque chose a été mallocé

Étant donné un pointeur sur une variable, existe-t-il un moyen de vérifier si elle a été allouée de manière statique ou dynamic?

Citant votre commentaire:

Je fais une méthode qui va se débarrasser d’une structure. il a un membre de données qui est un pointeur sur quelque chose qui peut ou ne peut pas être malloced .. selon lequel, je voudrais le libérer

La bonne façon consiste à append un autre membre à la structure: un pointeur sur une fonction de désallocation.

Il ne s’agit pas simplement d’une allocation statique ou dynamic. Il existe plusieurs allocateurs possibles, dont malloc() n’est qu’un.

Sur les systèmes de type Unix, cela pourrait être:

  • Une variable statique
  • Sur la stack
  • Sur la stack mais alloué dynamicment (ie alloca() )
  • Sur le tas, alloué avec malloc()
  • Sur le tas, alloué avec un new
  • Sur le tas, au milieu d’un tableau alloué avec new[]
  • Sur le tas, dans une structure allouée avec malloc()
  • Sur le tas, au sein d’une classe de base d’un object alloué avec new
  • Atsortingbué avec mmap
  • Alloué avec un allocateur personnalisé
  • Beaucoup plus d’options, y compris plusieurs combinaisons et variations de ce qui précède

Sous Windows, vous disposez également de plusieurs LocalAlloc exécution, LocalAlloc , GlobalAlloc , HeapAlloc (avec plusieurs tas que vous pouvez créer facilement), etc.

Vous devez toujours libérer de la mémoire avec la fonction de libération appropriée pour l’allocateur que vous avez utilisé. Donc, soit la partie du programme responsable de l’allocation de mémoire doit également libérer la mémoire, soit vous devez transmettre la fonction de libération correcte (ou un wrapper autour de celle-ci) au code qui libérera la mémoire.

Vous pouvez également éviter tout le problème en exigeant que le pointeur soit toujours atsortingbué à un allocateur spécifique ou en fournissant vous-même l’allocateur (sous la forme d’une fonction pour allouer la mémoire et éventuellement d’une fonction pour la libérer). Si vous fournissez vous-même l’allocateur, vous pouvez même utiliser des astuces (comme des pointeurs étiquetés) pour permettre à un utilisateur d’utiliser également l’allocation statique (mais je n’entrerai pas dans les détails de cette approche ici).

Raymond Chen a écrit un article à ce sujet (centré sur Windows, mais les concepts sont les mêmes partout): Allocation et libération de mémoire au-delà des limites de modules

La bibliothèque ACE le fait partout. Vous pourrez peut-être vérifier comment ils le font. En général, vous ne devriez probablement pas avoir besoin de faire cela au départ …

Comme le tas, la stack et la zone de données statiques occupent généralement différentes plages de mémoire, il est possible, avec une connaissance intime de la mappe de mémoire de processus, d’examiner l’adresse et de déterminer la zone d’allocation dans laquelle elle se trouve. Cette technique est à la fois une architecture et spécifique au compilateur, ce qui rend le portage de votre code plus difficile.

La plupart des implémentations de libc malloc fonctionnent en stockant un en-tête avant chaque bloc de mémoire renvoyé contenant des champs (à utiliser par l’appel free) qui contiennent des informations sur la taille du bloc, ainsi qu’une valeur “magique”. Cette valeur magique a pour but de protéger l’utilisateur contre la suppression accidentelle d’un pointeur qui n’a pas été alloué (ou la libération d’un bloc écrasé par l’utilisateur). Comme il s’agit d’un système très spécifique, vous devez examiner l’implémentation de votre bibliothèque libc pour voir exactement quelle est la valeur magique.

Une fois que vous savez cela, vous déplacez le pointeur donné vers le point d’en-tête, puis vérifiez sa valeur magique.

Pouvez-vous vous connecter à malloc () lui-même, comme le font les débogueurs malloc, en utilisant LD_PRELOAD ou quelque chose de ce genre? Si tel est le cas, vous pouvez conserver un tableau de tous les pointeurs alloués et l’utiliser. Sinon, je ne suis pas sûr. Existe-t-il un moyen d’obtenir des informations sur la comptabilité chez malloc?

Pas comme une fonctionnalité standard.
Une version de débogage de votre bibliothèque malloc pourrait avoir une fonction pour le faire.

Vous pouvez comparer son adresse à quelque chose que vous savez statique, et dire qu’elle est mallocable uniquement si elle est éloignée, si vous savez quelle scope elle devrait provenir, mais si elle est inconnue, vous ne pouvez pas vraiment vous fier à cela.

1.) Obtenez un fichier de carte pour le code que vous avez.

2.) La plate-forme cible de processus / matériel sous-jacente doit avoir un fichier de mappage de mémoire qui indique généralement: l’adresse de départ de la mémoire (stack, tas, valeur globale0, taille de ce bloc, atsortingbuts de lecture-écriture de ce bloc de mémoire.

3.) Après avoir obtenu l’adresse de l’object (variable du pointeur) du fichier mao dans 1.), essayez de voir dans quel bloc se situe cette adresse. vous pourriez avoir une idée.

= AD