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 :

instanciation dynamique et destruction


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut instanciation dynamique et destruction
    Bonjour,
    Je me permet de poser une petite question qui me titille, n'ayant pas trouvé de réponse.
    Imaginons que dans un objet X, je déclare un pointeur vers l'objet Y en parametre de classe. Dans ce cas je peux le creer via le constructeur :
    et je peux le détruire avec le destructeur :
    Maintenant dans un autre cas, où, dans une méthode de l'objet X, je doive instancier dynamiquement un objet Z :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void X::maMethode() {
    	Z *monObjetZ = new Z;
    }
    Dans ce dernier cas, ya t'il besoin de détruire monObjetZ, si oui, comment puis je procéder puisqu'impossible avec le destructeur de X ?

    je m'excuse si ma question semble idiote pour certains, mais je n'ai pas de longs mois d'expériences
    Merci de votre réponse.

    Ancol

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Bonjour,

    Tout dépend de ce que tu comptes faire de l'objet pointé par monObjetZ.

    Dans maMethode() telle qu'elle est codée actuellement, l'objet Z est créé mais le pointeur vers celui-ci est détruit à la fin de maMethode(), au même titre que n'importe quelle variable locale. Donc non seulement l'objet sera inutilisable mais on provoquera en plus une fuite de mémoire. Le pointeur vers l'objet Z créé doit être retourné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Z* X::maMethode() { return new Z; }
    Je ne sais pas si ça répond à ta question ...

    PS: Ca ne te dispense pas de devoir, plus tard, désallouer cet objet.
    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Z* X::maMethode() { return new Z; }
     
    void X::autreMethode()
    {
      Z* ptrObjetZ = maMethode();
     
      /* ... on utilise ptrObjetZ ... */
     
      delete ptrObjetZ;
    }
    Bien entendu, maMethode() telle qu'est est codée actuellement n'a que peu d'intérêt

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci de la réponse, ca à répondu à la question.
    Malheureusement ca ne ressoud pas mon probleme qui est un peu plus compliqué ^^

    Dans le cadre de réalisation d'un projet personnel, je possede 2 classes : X et Y.
    X possede un conteneur d'objets Y, ce dernier s'instanciant de cette maniere :
    Y(X &unX, int val1, int val2, ..(etc).. )
    ce constructeur entrainant unX.addY(*this) pour ajouter le Y instancié dans la liste de X.

    Comme je souhaite gerer plusieurs objets de X, j'ai fait un manager (class M) qui possede en parametre : X &monX.
    Je peux donc dans le constructeur de la classe M instancier : monX = new X;
    ainsi qu'ajouter des Y (dans une méthode Init()) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Y *newY1 = new Y(*monX, 1,2, (...));
    Y *newY2 = new Y(*monX, 4,5, (...));
    Ce systeme me permet, à un niveau supérieur de mon projet, de faire autant de classes héritées de M, ainsi de gerer différentes méthodes Init() suivant mes besoins.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Manager1 m1;
    Manager2 m2;
    enfin bref, je fais mes ptits traitements comme ca.

    Y a t'il une solution adaptée, ou mon bazar est il completement naze ?

    merci

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 68
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Z* X::maMethode() { return new Z; }
     
    void X::autreMethode()
    {
      Z* ptrObjetZ = maMethode();
     
      /* ... on utilise ptrObjetZ ... */
     
      delete ptrObjetZ;
    }
    Bien entendu, maMethode() telle qu'est est codée actuellement n'a que peu d'intérêt
    Dans ce cas, il est même conseillé d'utiliser un smart pointer, ca évite bien des erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Z* X::maMethode() { return new Z; }
     
    void X::autreMethode()
    {
      auto_ptr<Z> ptrObjetZ = maMethode();
     
      /* ... on utilise ptrObjetZ ... */
    }

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 68
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par Ancol Voir le message
    Merci de la réponse, ca à répondu à la question.
    Malheureusement ca ne ressoud pas mon probleme qui est un peu plus compliqué ^^

    Dans le cadre de réalisation d'un projet personnel, je possede 2 classes : X et Y.
    X possede un conteneur d'objets Y, ce dernier s'instanciant de cette maniere :
    Y(X &unX, int val1, int val2, ..(etc).. )
    ce constructeur entrainant unX.addY(*this) pour ajouter le Y instancié dans la liste de X.

    Comme je souhaite gerer plusieurs objets de X, j'ai fait un manager (class M) qui possede en parametre : X &monX.
    Je peux donc dans le constructeur de la classe M instancier : monX = new X;
    ainsi qu'ajouter des Y (dans une méthode Init()) :
    Y *newY1 = new Y(*monX, 1,2, (...));
    Y *newY2 = new Y(*monX, 4,5, (...));

    Ce systeme me permet, à un niveau supérieur de mon projet, de faire autant de classes héritées de M, ainsi de gerer différentes méthodes Init() suivant mes besoins.

    Manager1 m1;
    Manager2 m2;

    enfin bref, je fais mes ptits traitements comme ca.

    Y a t'il une solution adaptée, ou mon bazar est il completement naze ?

    merci
    Si je comprends bien, tu souhaites créer des objets mais en te laissant le liberté de choisir comment les instancier. Tu dois pour cela t'orienter vers le design pattern Factory => http://gfx.developpez.com/tutoriel/c...tern/fabrique/


    Note: pour le conteneur d'objets Y présent dans X, je te conseille d'utiliser un conteneur de la STL si ce n'est déjà fait, c'est sur et rapide => http://cpp.developpez.com/cours/cpp/?page=page_20

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    merci beaucoup je vais me renseigner à ce sujet.
    Et oui j'utilise bien conteneur de la STL

    Bonne journée

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

Discussions similaires

  1. [c# 2.0] Instanciation dynamique de classe
    Par Arthis dans le forum ASP.NET
    Réponses: 3
    Dernier message: 10/10/2006, 18h03
  2. Instanciation dynamique d'un tableau
    Par polo54 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 08/06/2006, 10h37
  3. Instanciation dynamique
    Par yon386 dans le forum C++
    Réponses: 5
    Dernier message: 15/02/2006, 21h32
  4. [VB.NET] instanciation dynamique
    Par lucie.houel dans le forum ASP.NET
    Réponses: 1
    Dernier message: 21/11/2005, 12h54
  5. Instanciation dynamique d'ActiveX
    Par cathar_rhythm dans le forum MFC
    Réponses: 12
    Dernier message: 28/06/2005, 08h11

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