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++Builder Discussion :

pointeur multiple sur un objet


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 35
    Points : 30
    Points
    30
    Par défaut pointeur multiple sur un objet
    Comment peut'on supprimer proprement un objet qui est pointé par deux pointeurs?
    En fait je renplit une Tlist avec des objet crée dynamiquement (avec des "new") et en quittant mon programme détruit tous les éléments de la liste, mais builder me dit que la mémoire n'est pas totalement libérée et m'indique l'endroit ou je remplit ma liste comme source de l'erreur, je ne comprends plus rien svp aidez moi!

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    J'aurais bien une solution propre et robuste, mais elle impliquerait de se passer de la VCL au profit du C++
    => std::list<boost::shared_ptr<OBJ_TYPE> >
    Autrement, l'objet pointé doit être détruit une et une seule fois.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    Justement c'est bien ce que je fais mais builder me dit que je ne libére pas toute la mémoire! Mais bon maitenant que je suis sûr qu'il ne faut supprimer qu'une seul fois l'objet pointé je vais vérifier mon code!
    Merci

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Peut-être que ceci pourrait convenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //tant que la liste n'est pas vide
    while(Liste->Count != 0)
        {
    //prendre le premier élément de la liste
        void *P = Liste->First(); //j'ai mis void*...voir ce qui convient...
    //le retirer de la liste
        Liste->Delete(Liste->IndexOf(P));
    //Tester si l'élément est dupliqué
        if(Liste->IndexOf(P) == -1)
            {
    //S'il ne l'est pas alors détruire
            delete P;
            }
        }
    A plus !

  5. #5
    Membre habitué
    Avatar de Freeze
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut
    je fais comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (int i=0;i<Liste->Count;i++)
       delete (void *)Liste->Items[i];
    delete Liste;
    même remarque pour le void * à toi de voir ce que tu as mis dedans ...

  6. #6
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonjour,
    dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delete (void *)Liste->Items[i];
    fonctionne bien si les pointeurs sont de type void
    dans le cas contraire la libération mémoire ne sera pas complète
    c'est le probl'me avec un Tlist car c'est a toi de savoir ce que contient ta liste
    si par exemple c'est des TButtons qui sont stockés dans ta liste le code correct pour la destruction est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (int n=0;n<Liste->Count;n++)
     delete (TButton*)Liste->Items[i]; 
    delete Liste
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    Merci bcp pour vôtre praticipation active! je vais essayer comme vous faite, moi je fais comme ca, mais je sais pas si c'est la bonne solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(int i = (List->Count - 1); i >= 0; --i)
         List->Delete(i);
    delete List;
    Merci encore!

  8. #8
    Membre habitué
    Avatar de Freeze
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut
    for(int i = (List->Count - 1); i >= 0; --i)
    List->Delete(i);
    delete List;
    et bien justement non !!! quand tu fais cela tu ne supprimes l'allocation en mémoire de l'objet que tu as rangé dans ta TList ...

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    Oui je viens de m'en rendre compte! En plus c'est bien spécifié dans l'aide de Builder ! Désolé! Mais maitenant j'ai compris et tout fonctionne c'est super! Merci pour toute vôtre, ce forum est génial bye

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    L'exemple que j'ai donné est vrai, par exemple, pour une liste de bitmaps, en supposant
    qu'un bitmap puisse être dessiné plusieurs fois et ce grace à cette liste, mais ce qui
    serait une conception relativement maladroite. Dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Graphics::TBitmap *B = (Graphics::TBitmap *)List->First();
    ...
    delete B;
    Par contre, si les objets descendent de TComponent, il existe une solution très simple
    qui consiste à affecter aux objets crées un propriétaire commun du type TComponent
    En effet, la destruction d'un objet entraine celle des objets qu'il détient.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TComponent *LeProprietaire;
    TList *List = new TList;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //créer un objet qui va servir de propriétaire
    LeProprietaire = new TComponent(this); //this ou ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //création des objets
    TPanel *P = new TPanel(LeProprietaire);
    P->Parent = this;//this ou là où il s'affiche
    P->SetBounds(10,20, 60, 24);
    List->Add(P);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //destruction des objets
    delete LeProprietaire; // tous les objets détenus sont détruits avec lui !
    List->Clear();
    A plus !

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

Discussions similaires

  1. Tris multiples sur Objets
    Par gudul dans le forum Langage
    Réponses: 2
    Dernier message: 04/12/2007, 19h47
  2. [débutant] tester un pointeur sur un objet
    Par hogan dans le forum C++
    Réponses: 26
    Dernier message: 30/03/2007, 10h02
  3. utilisations de pointeurs sur des objets
    Par niarkyzator dans le forum Delphi
    Réponses: 21
    Dernier message: 13/12/2006, 09h42
  4. [Ada] Récupérer un pointeur sur un objet existant
    Par vincnet500 dans le forum Ada
    Réponses: 1
    Dernier message: 14/11/2004, 14h26
  5. vector de pointeurs sur des objet
    Par jean-bobby dans le forum SL & STL
    Réponses: 26
    Dernier message: 06/08/2004, 14h54

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