Question

Etant 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 dynamique?

Était-ce utile?

La solution

Citant votre commentaire:

  

Je suis en train de créer 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 à ajouter un autre membre à la structure: un pointeur sur une fonction de désallocation.

Il ne s’agit pas seulement d’une allocation statique ou dynamique. 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 pile
  • Sur la pile mais alloué dynamiquement (c'est-à-dire alloca () )
  • Sur le tas, alloué avec malloc ()
  • Sur le tas, alloué avec nouveau
  • Sur le tas, au milieu d'un tableau alloué avec new []
  • Sur le tas, dans une structure allouée avec malloc ()
  • Sur le tas, dans la classe de base d'un objet affecté de new
  • Alloué avec mmap
  • Alloué avec un allocateur personnalisé
  • Beaucoup d'autres options, y compris plusieurs combinaisons et variantes de ce qui précède

Sous Windows, vous disposez également de plusieurs environnements d'exécution, LocalAlloc , GlobalAlloc , HeapAlloc (avec plusieurs tas que vous pouvez créer facilement), et 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 appropriée (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 attribué à 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 publie un article sur son blog (centré sur Windows, mais les concepts sont identique partout): Allocation et libération de la mémoire au-delà des limites du module

Autres conseils

La bibliothèque ACE le fait partout. Vous pourrez peut-être vérifier comment ils le font. En général, vous n’auriez probablement pas besoin de le faire en premier lieu, mais

Etant donné que le tas, la pile 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, de rechercher l'adresse et de déterminer la zone d'allocation dans laquelle elle se trouve. Cette technique L’architecture et le compilateur sont spécifiques, 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é qui contient des champs (à utiliser par l'appel free ()) contenant des informations sur la taille du bloc, ainsi qu'une valeur "magique". Cette valeur magique sert à 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). C’est très spécifique au système, vous devez donc regarder l’implémentation de votre bibliothèque libc pour voir exactement quelle est la valeur magique.

Une fois que vous le savez, vous déplacez le pointeur donné sur son 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 du 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é de malloc?

Pas en tant que 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 portée elle devrait provenir, mais si elle est inconnue, vous ne pouvez pas vraiment vous fier. ça.

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

2.) La plate-forme cible 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 (pile, tas, valeur globale0, taille de ce bloc, attributs lecture / écriture de ce bloc de mémoire.

3.) Après avoir obtenu l'adresse de l'objet (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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top