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 :

Cycle de pointeur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Par défaut Cycle de pointeur
    Bonjour,

    Je suis entrain de faire une classe qui a besoin de savoir détecter les cycles de pointeurs pour pourvoir bien les supprimer de façon à ce qu'il ne reste plus rien dans le tas.

    Comment est ce que je pourrai procéder??

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    boost::weak_ptr/shared_ptr font ça, tu peux voir à voir comment ils s'y prennent

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Par défaut
    Merci, j'ai regardé mais jy comprend rien.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Le principe d'un pointeur est que derrière lui se cache une zone mémoire.
    Quand on déclare un pointeur, on ne fait rien d'autre que dire "là se trouvera le début d'une zone mémoire", ou plutôt "là est l'adresse physique du début d'une zone mémoire".
    A ce stade, on a écrit
    TRUC *ptrSurTruc;
    TRUC est une structure, une classe, un typedef, c'est à dire le type de l'objet sur lequel va pointer ptrSurTruc.

    Maintenant on veut travailler avec cet objet. On doit réserver une zone mémoire de taille nécessaire, c'est à dire la taille de TRUC.
    Il y a deux instructions qui permettent cela : malloc (standard C) et new (mot clé C++)
    Dans les deux cas, la mémoire réservée est disponible, mais pas à l'abri d'un écrasement, jusqu'à ce qu'elle soit libérée.
    Les instructions de libération (ou destruction) sont respectivement free(ptrSurTruc); et delete ptrSurTruc;
    Free est une fonction comme l'est aussi malloc(...), new et delate sont des mort clé.

    La bonne méthode est de libérer la mémoire dans le sens inverse que celui où elle a été allouée, et de préférence au même niveau, c'est à dire si l'allocation a été faite dans le main() il vaut mieux faire la libération dans le main, si elle a été faite dans une fonction, la libération sera faite dans une fonction appelée au même niveau.

    Par contre, si votre question est de savoir comment vérifier si toute la mémoire a bien été libérée, mon compilateur le fait, on peut développer cela, mais ce sont des traitements très lourds.
    Cependant, il peut y avoir une solution assez simple qui consiste à mettre dans un variable la quantité de mémoire disponible en début d'exécution, lire la même valeur en fin d'exécution et comparer. Ca peut servir, mais c'est sans garantie, puisque d'autre processus peuvent être intervenus entre-temps.

    Cordialement.

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Joel F Voir le message
    boost::weak_ptr/shared_ptr font ça, tu peux voir à voir comment ils s'y prennent
    Ils detectent les cycles? Tu as une reference?

    A ma connaissance le principe des weak_ptr est d'avoir des pointeurs qui ne compte pas pour savoir si un objet est vivant ou pas et qui seront remis a NULL quand on GC l'objet pointe (ce qui est possible quand il n'y a pas d'autres pointeurs non weak qui referencent l'objet). On peut parfois utiliser un weak_ptr pour eviter d'avoir un cycle, mais il y a d'autres usages.

  6. #6
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Ils detectent les cycles? Tu as une reference?
    Je suis en train de la cherché. J'ai peur d'avoir vu ça dans le trunk et non dans release

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145

Discussions similaires

  1. pointeurs
    Par ghost74 dans le forum C
    Réponses: 3
    Dernier message: 14/12/2002, 02h52
  2. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43
  3. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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