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 :

Destruction de pointeurs


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Par défaut Destruction de pointeurs
    Bonjour à tous,

    j'étais en train de faire un petit programme, lorsqu'une question m'est venue à l'esprit. Voici le bout de code qui me "pose problème" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Object* Object::updateObject(Object* obj)
    {
        Object* ob = new Object(*obj);
        return ob;
        delete ob;
    }
    Je n'ai pas développé cette méthode mais je me posais la question de savoir si cela marchait !? On m'a dit que lorsqu'on fait une allocation dynamique (new), il fallait toujours libérer la mémoire ensuite...

    Mais dans ce cas-là est-il possible de libérer la mémoire après le return ?? Ou alors quand dois-je le faire ??

    Merci pour votre aide !

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 032
    Billets dans le blog
    12
    Par défaut
    "Ca ne marchera jamais !!"
    le return te fait sortir de ta fonction et n'exécute pas le code qui se trouve ensuite.
    Pour la question de savoir ou et quand tu dois le faire, ta fonction s'appelle update, donc plutôt que de créer et renvoyer un nouveau pointeur, il faudrait plutôt modifier le pointeur passé en argument. De plus c'est une fonction membre de Object, donc tu devrais préciser ce que ta fonction doit faire, parce que là ça me parait obscur.
    Je ferais plutôt ce genre de choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Object( const Object & p_object) // Constructeur par copie
    {
    	// copie des valeurs des membres de p_object dans mes membres
    }
     
    Object & operator =( const Object & p_object) // opérateur d'assignation qui correspondrait à une fonction d'update
    {
    	// copie des valeurs des membres de p_object dans mes membres
    	return * this;
    }
    En règle générale, celui qui crée le pointeur devrait se charger de le détruire.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 061
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 061
    Billets dans le blog
    142
    Par défaut
    Bonjour,
    Mais dans ce cas-là est-il possible de libérer la mémoire après le return ?? Ou alors quand dois-je le faire ??
    Dans un sens, j'ai envie de répondre oui. Mais pas dans le sens que vous imaginiez.

    Prenons une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sprite* loadSpriteFromFile(const std::string& file)
    {
         // Ici, même si c'est un peu caché, il y a allocation de mémoire (ou de ressources)
         Sprite* mySprite = loadSprite(file);
     
         // Je retourne mon pointeur qui est prêt à être utilisé
         return mySprite;
     
         // Comme dragonjoker59 l'a dit ... ici je ne peux rien faire car je suis en dehors de la fonction
        // Le compilateur intelligent, nous indiquera un warning pour nous dire que le code n'est jamais atteint ;)
    }
    Voilà ... tout est écrit dans les commentaires. Mais alors, que vais-je faire de mon pointeur ?
    Et bah, pour désallouer celui-là il faudra le faire dans la fonction qui appelle loadSpriteFromFile();

    Par exemple (exemple simpliste)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main(void)
    {
        Sprite* mySprite = loadSpriteFromFile("image.png");
     
        // Utilisation du sprite
     
        // Une fois que l'on en a plus besoin, on peut le supprimer
        delete mySprite;
        return 0;
    }
    En fait, je n'aime pas trop ce code. Car pour moi, l'appel à l'allocation de mémoire (que ce soit new, ou autre) est caché dans une fonction, et que ce doit être la fonction appelante ou autre qui doit faire en sorte que la ressource est bien désalloué.
    Dans le cas parfait, la ressource devrait être désalloué dans le bloc ou elle est alloué (ou au grand maximum dans la classe qui englobe le tout), sinon, le code commence à tendre dans des cas ou les fuites de mémoires sont facile à faire (vu que l'allocation est "cachée")
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Par défaut
    D'accord merci de votre !!

    Je me doutais bien qu'il y avait un truc dans le genre mais ce n'était pas du tout clair... maintenant si

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    En fait, je n'aime pas trop ce code.
    Il est même horrible en c++ : ce genre de chose est réservé au C qui ne possède pas de destructeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Object* Object::updateObject(Object* obj)
    {
        Object* ob = new Object(*obj);
        return ob;
        delete ob;
    }
    Je suppose que ce n'est pas le vrai code (sinon il revient à faire un new).
    Serait-il possible d'avoir le vrai code car ce genre de fonction est plutôt rare et présente souvent une faute de design (personne n'est responsable de l'objet).
    Si tu es sur de ton design, tu peux te tourner vers les pointeurs intelligents.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Par défaut
    Exact c'est plutôt horrible !! Mais ce n'est pas un bout de code, c'est juste qu'en implémentant une fonction je me suis posé des questions... et je voulais avoir votre avis C'est en faisant des erreurs et en se posant des questions qu'on progresse

    Mais dans mon code je n'ai pas ce genre de chose !! Merci pour les conseils...

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/09/2009, 01h38
  2. Destruction d'un pointeur
    Par julieng31 dans le forum Débuter
    Réponses: 2
    Dernier message: 29/01/2009, 21h01
  3. Réponses: 3
    Dernier message: 25/11/2008, 15h52
  4. probleme de destruction de pointeur
    Par Dom_the_quaker dans le forum C++
    Réponses: 6
    Dernier message: 09/06/2008, 17h05
  5. pointeur et destruction
    Par darkfrag dans le forum C++
    Réponses: 7
    Dernier message: 19/05/2007, 15h41

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