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 du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    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 du Club
    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
    Points : 61
    Points
    61
    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 du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    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 du Club
    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
    Points : 61
    Points
    61
    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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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 éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    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 : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    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 du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    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 régulier
    Inscrit en
    Décembre 2003
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 87
    Points : 87
    Points
    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
    Points : 13 017
    Points
    13 017
    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 du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    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