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 :

vector et cr�ation d'objets


Sujet :

C++

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Par d�faut vector et cr�ation d'objets
    Bonjour, je reviens avec un vieux probl�me.

    J'ai une fonction qui cr�e des objets pour les placer dans un vecteur. Comme tout le monde sait, lorsqu'une fonction se termine elle lib�re tout ce qui a �t� d�clar�, instanci� ainsi que les pointeurs (directs).

    J'aimerais �crire donc ceci de fa�on moins compliqu�e et avec un style c++ :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    private :
    vector<CDraw*> images;
     
    ...
     
    void fonction() {
     
    CDraw **draw;
    draw = (CDraw**)malloc(sizeof(CDraw*));
    *draw = new CDraw(true, complet_file.c_str(), coord_, coef_resol);
     
    // We reverse picture on Y axis
    if(orientation_)
    (*draw)->reverse_H_SDL();
     
    images.push_back(*draw);
     
    }

  2. #2
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    85
    D�tails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2010
    Messages : 85
    Par d�faut
    salut !

    c'est le bazard ton truc ?!

    Comme tout le monde sait, lorsqu'une fonction se termine elle lib�re tout ce qui a �t� d�clar�, instanci� ainsi que les pointeurs (directs).
    c'est quoi un pointeur direct. Si tu instancie avec new il faut lib�rer avec delete dans ta fonction ou ailleurs (destructeur, autre fonction...).

    je ne comprends pas trop l'int�ret du double pointeur ni du malloc...

    enfin si tu fait du c++, tu fait du c++, pas du C style c++

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Par d�faut
    Justement, si je fais au milieu de la fonction un

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    void fonction() {
       int * p1 = new int;
    }
    Lorsque la fonction prendra fin, le pointeur p1 dispara�tra. J'aurais des probl�mes de r�f�rencement delete ou pas delete.

    L'int�ret du double pointeur en C, c'est de permettre de conserver une allocation dynamique faite dans une fonction.

    PS (la fin de'une fonction ne lib�re pas tout l'objet en m�moire me suis mal exprim� plus haut)

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    85
    D�tails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2010
    Messages : 85
    Par d�faut
    si tuveux r�cup�rer ton pointeur immediatement, tu peux faire

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    obj* fonction() {
    obj* p1 = new obj; 
    return p1;
    }
    sinon c'est le dernier �l�ment de ton vector, si tu a fait ton push_back.

    Classiquement, tu lib�re le contenu de ce vector avec le destructeur de ta classe. Il y a diff�rentes m�thodes +/- sophistiqu�es/�l�gantes/...

    new est une allocation dynamique.

  5. #5
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Citation Envoy� par killwin Voir le message
    Justement, si je fais au milieu de la fonction un

    void fonction() {
    int * p1 = new int;
    }

    Lorsque la fonction prendra fin, le pointeur p1 dispara�tra. J'aurais des probl�mes de r�f�rencement delete ou pas delete.

    L'int�ret du double pointeur en C, c'est de permettre de conserver une allocation dynamique faite dans une fonction.

    PS (la fin de'une fonction ne lib�re pas tout l'objet en m�moire me suis mal exprim� plus haut)
    Bonjour,

    il faudrait (re)voir un cours sur les pointeurs.
    Oui p1 sera supprim�e, mais scoop : on s'en moque.
    La zone m�moire allou�e et sur laquelle pointe p1 subsiste jusqu'� son delete.

    Tu n'as aucun int�r�t � allouer un pointeur de pointeur, � part se faire un noeud au cerveau et cr�er une possible fuite m�moire suppl�mentaire.
    Et d'ailleurs, ton code en pr�sente une belle de fuite m�moire.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void fonction() {
     
    CDraw *draw = new CDraw(true, complet_file.c_str(), coord_, coef_resol);
     
    // We reverse picture on Y axis
    if(orientation_)
    draw->reverse_H_SDL();
     
    images.push_back(draw);
     
    }
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  6. #6
    Membre �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    vector< shared_ptr<CDraw> > images;
     
    ...
     
    void fonction()
    {
    shared_ptr<CDraw> draw = shared_ptr<CDraw>::make(true, complet_file.c_str(), coord_, coef_resol);
     
    // We reverse picture on Y axis
    if(orientation_)
     draw->reverse_H_SDL();
     
    images.push_back(draw);
    }
    C'est tout je crois.

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Secteur : Sant�

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    shared_ptr<CDraw>::make(...) -> make_shared<CDraw>(...)
    Ou unique_ptr si on veut que le tableau soit l'unique responsable de la dur�e de vie des objets point�s (ie tous les objets sont dans le tableau et si le tableau est d�truit, aucun objet n'est cens� encore �tre utilis�)

    Mais sinon, c'est effectivement l'approche la plus sur (pas de pointeurs nus) donc celle qui faut recommander pour les d�butants et les personnes plus exp�riment�s (en premi�re approche ; si ensuite, une personne plus exp�riment�e sait ce qu'elle fait et qu'elle a fait des tests de performances et vu que les smart pointeurs sont un frein, elle pourra changer dans un second temps)

  8. #8
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Par d�faut merci
    Merci, je vais tester shared_ptr qui est la r�ponse � ma question et que je ne connaissais pas.

  9. #9
    Membre confirm�
    Inscrit en
    D�cembre 2003
    Messages
    87
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2003
    Messages : 87
    Par d�faut
    Citation Envoy� par Bousk Voir le message
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void fonction() {
     
    CDraw *draw = new CDraw(true, complet_file.c_str(), coord_, coef_resol);
     
    // We reverse picture on Y axis
    if(orientation_)
    draw->reverse_H_SDL();
     
    images.push_back(draw);
     
    }
    Il faut noter que ce code contient aussi une fuite m�moire si la fonction reverse_H_SDL peut lancer une exception. Dans ce cas il convient de faire:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    void fonction() {
     
        CDraw *draw = new CDraw(true, complet_file.c_str(), coord_, coef_resol);
     
        // We reverse picture on Y axis
        try{
            if(orientation_)
                draw->reverse_H_SDL();
        }
        catch (...) {      // Catch all exceptions.
            delete draw;   // Delete the draw object.
            throw;         // Rethrow the exception so it can be handled outside the function.
        }
     
        images.push_back(draw);
     
    }
    et bien sur il faut d�truire les objets cr��s dans le destructeur:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    ~ClassName() {
        for (std::vector<CDraw*>::iterator it = images.begin(); it != images.end(); ++it) {
            delete *it;
        }
    }
    Tout cela est bien sur beaucoup moins lisible et safe que l'utilisation de shared_ptr (ou unique_ptr).

  10. #10
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Salut,
    Citation Envoy� par killwin Voir le message
    Merci, je vais tester shared_ptr qui est la r�ponse � ma question et que je ne connaissais pas.
    Un peu de lecture tr�s utile en ce cas : Pr�sentation des pointeurs intelligents en C++ par Lo�c Joly

  11. #11
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Par d�faut Merci
    C'est r�solu et merci pour la doc sur les pointeurs intelligents.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Vector et cr�ation d'objets
    Par killwin dans le forum D�buter
    R�ponses: 5
    Dernier message: 29/08/2012, 08h59
  2. [PowerBuilder] Cr�ation d'objets dynamiques
    Par B�n�123456789 dans le forum Powerbuilder
    R�ponses: 3
    Dernier message: 12/06/2006, 00h33
  3. [JMenuBar] Cr�ation d'objets � la vol�e
    Par Rampa dans le forum Composants
    R�ponses: 5
    Dernier message: 29/06/2005, 13h56
  4. [FLASH MX2004] Cr�ation d'objet dynamiquement
    Par noarno dans le forum Flash
    R�ponses: 3
    Dernier message: 15/12/2004, 11h00
  5. Comment initialiser un vector � sa cr�ation ?
    Par Clad3 dans le forum SL & STL
    R�ponses: 7
    Dernier message: 10/12/2004, 15h01

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