IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

savoir si un pointeur pointe vers une zone allouée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Par défaut [Résolu] savoir si un pointeur pointe vers une zone allouée
    Mon idée est la suivante.

    Lorsque l'on utilise les fonctions malloc ou calloc, on réserve une zone mémoire. Puis plus tard, on peut la libérer en utilisant la fonction free.

    Existe-t'il une fonction qui puisse nous dire si oui on non le free a été fait. Je m'explique: celle ci prendrait un pointeur en argument et nous dirait si celui ci pointe vers une zone que l'on a préalablement réservée, ou si elle pointe vers une zone non réservée?

  2. #2
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Je ne connais pas de fonction qui le fasse.
    Free() ne renvoyant rien, tu peux tester la valeur de ton pointeur mais je crois que meme après un free(), le ptr ne vaut pas NULL.
    genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    free(ptr) ;
    if(!ptr)
    puts("ok");
    else puts("rate") ;
    Nas'

  3. #3
    Membre confirmé

    Inscrit en
    Mai 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 39
    Par défaut
    D'ou l'intêret de se faire une macro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define free(ptr) free(ptr),ptr=NULL

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Par défaut
    Euh il va y avoir une erreur de lecture si tu fais un if sur un pointeur pas alloué non ?

  5. #5
    Membre confirmé

    Inscrit en
    Mai 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 39
    Par défaut
    Citation Envoyé par Yabo
    Euh il va y avoir une erreur de lecture si tu fais un if sur un pointeur pas alloué non ?
    Non, pas forcément, il faut donc prendre ses précautons avant de faire des bêtises

  6. #6
    Membre éclairé
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Par défaut macro free
    Citation Envoyé par leneuf22
    D'ou l'intêret de se faire une macro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define free(ptr) free(ptr),ptr=NULL
    Effectivement ta macro est interressante, je pense que cela va me servir etant donné que je ne me sers en fait pas de free mais d'une fonction propriétaire.

    Mais bon ce n'est pas si simple que cela. J'ai vraiment besoin d'une fonction qui me dise si la zone sur laquelle on pointe est désallouée ou non. Si cela n'existe pas, c'est un peu domage...

  7. #7
    Membre éclairé
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Par défaut free
    Citation Envoyé par NaskY
    Je ne connais pas de fonction qui le fasse.
    Free() ne renvoyant rien, tu peux tester la valeur de ton pointeur mais je crois que meme après un free(), le ptr ne vaut pas NULL.

    Nas'
    Non justement malheureusement il ne vaut pas nul

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 10
    Par défaut
    Non ca n'existe pas. La valeur du pointeur est égale à une adresse, point.

    Le meilleur moyen comme dit plus haut est de tester s'il est null et de le remettre à null à chaque désallocation. C'est ce qu'il y a de plus propre.

  9. #9
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Tu peux regarder le source de memwatch (ou autre malloc debugger), il [memwatch] se souvient de tous les allocs/free effectues ! C'est des redefinitions (macros) des fonctions alloc/malloc/free/...

    Dans les traces de memwatch, il te dit si tu fais 2 fois un free je crois, mais il faut compiler tous les sources avec #include "memwatch.h", ce qui n'est a priori (d'apres tes posts pas gagne). Tu peux donc essayer une technique similaire:
    - tu redefinis les appels vers les fonctions prop. avec des maj de structures internes (tableau de pointeurs indiquant, par exemple, alloues, la taille, la date...)
    - apres, si c'est juste pour du debug tu fait des traces, sinon, tu fais des fonctions pour acceder a cette structure.

  10. #10
    Membre éclairé
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Par défaut possible?
    Citation Envoyé par D[r
    eadLock]Tu peux regarder le source de memwatch (ou autre malloc debugger), il [memwatch] se souvient de tous les allocs/free effectues ! C'est des redefinitions (macros) des fonctions alloc/malloc/free/...
    Si j'ai bien compris, cela permet de savoir au fur et à mesure du debug si on gère correctement la mémoire. Mais est-ce que il est possible grâce à cette librairie d'atteindre des fonctions pour faire un truc du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    si(la zone mémoire sur laquelle p pointe est une zone allouée)
    {
      la désallouer
    }
    sinon
    {
      ne rien faire
    }
    : : :

    Car c'est ce que je cherche à faire.

  11. #11
    Expert éminent

    Avatar de Anomaly
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 380
    Billets dans le blog
    1
    Par défaut
    Je saisis pas bien l'intérêt de faire ce genre de condition, mais si tu veux réellement faire ça je ne vois pas d'autre solution que de réécrire malloc et free ; ces fonctions, en plus d'allouer de la mémoire (resp. la libérer), ajouteront dans une liste à toi le pointeur vers la zone mémoire et sa taille (resp. retirera cette référence). Ainsi, tu sauras exactement quelle mémoire sera allouée en parcourant ta liste à condition de bien n'utiliser pour tes allocations que tes deux fonctions personnelles.

  12. #12
    Membre éclairé
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Par défaut tant pis
    Citation Envoyé par Anomaly
    Je saisis pas bien l'intérêt de faire ce genre de condition, mais si tu veux réellement faire ça je ne vois pas d'autre solution que de réécrire malloc et free ; ces fonctions, en plus d'allouer de la mémoire (resp. la libérer), ajouteront dans une liste à toi le pointeur vers la zone mémoire et sa taille (resp. retirera cette référence). Ainsi, tu sauras exactement quelle mémoire sera allouée en parcourant ta liste à condition de bien n'utiliser pour tes allocations que tes deux fonctions personnelles.
    Ben justement j'utilise actuellement mes propres fonctions malloc et free, donc de ce côté là pas de problème. J'avais bien pensé à stocker ce genre d'infos, mais bon cela me paraissait fastidieux et c'est pour cela que je cherchais une fonction m'offrant ce type de fonctionnalité.

    Bon ben tant pis, je vais donc faire cela.

    Merci à tous pour votre coup de main.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/12/2009, 12h26
  2. Réponses: 12
    Dernier message: 25/06/2008, 19h27
  3. multisélection vers une zone de texte
    Par MAMANHOU dans le forum IHM
    Réponses: 10
    Dernier message: 20/09/2007, 12h14
  4. Pb de copie d'une liste vers une zone de texte
    Par lejujudu59 dans le forum IHM
    Réponses: 0
    Dernier message: 13/09/2007, 11h56
  5. [VBA Word] Créer un lien vers une zone d'un fichier Excel
    Par hirochirak dans le forum VBA Word
    Réponses: 7
    Dernier message: 19/12/2006, 12h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo