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

  1. #1
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    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 éprouvé
    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
    Points : 1 166
    Points
    1 166
    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 du Club

    Inscrit en
    Mai 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 39
    Points : 67
    Points
    67
    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 actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    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 du Club

    Inscrit en
    Mai 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 39
    Points : 67
    Points
    67
    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 habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    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 habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 10
    Points : 11
    Points
    11
    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 éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    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 habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    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
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 341
    Points : 130 362
    Points
    130 362
    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 habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    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