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 :

Probleme de retour d'objet


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut Probleme de retour d'objet
    Bonjour,
    j ai une fonction qui doit me retourner un objet pour que je puisse l'uiliser ensuite dans la fonction appelante, le probleme est que cet objet est detruit avant d etre renvoyé.

  2. #2
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Sois tu fais une allocation dynamique dans la fonction si tu tiens vraiment à retourner une valeur, soit tu passes un objet par référence (préférable).

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    On peut voir la fonction en question ?

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Voici la fonction qui crée l objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    H5File* HDF5_Open(const string file_Name, const int Access)
    {
    	if(Access == READ_DATA || Access == DELETE_DATA)
    	{
    		cout<<"le fichier existe ps, lecture ou suppression impossible"<<endl;
    		//return -1;
    	}
    	else
    	{
    		/* creation du fichier */
    		H5File* file_obj = new H5File( file_Name, H5F_ACC_TRUNC );
    		return file_obj;
    	}
    }
    et l appel de la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    H5File* file_obj = HDF5_Open(file_Name, WRITE_DATA);
    Ce qui pose probleme donc, c est que file_obj est detruit a la fin de la fonction HDF5_Open, l appel de la fonction recoit donc un pointeur incorrect!

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ah non, l'objet alloué/la mémoire allouée n'est pas libéré(e), donc il existe bien après. Sauf que tu dois avoir des warnings dans ta compilation que tu ne résouds pas.

  6. #6
    Membre confirmé Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Par défaut
    si ton objet est construit dans ta fonction, il est normal qu'il soit détruit à la fin de celle-ci, excepté si tu alloues dynamiquement l'espace memoire dédiée à celui-ci, bref que tu l'instancies à l'aide d'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonObjet *monObjet = new MonObjet();
    Sinon, comme le dit Joelle, tu peux passer une reference de ton objet en parametre de ta fonction et le modifier a l'interieur de celle-ci.

    EDIT: pourquoi mon avatar il s'annime pas

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    effectivement, j ai regle le probleme, mais sinon, comment fait on pour retourner un objet par reference?

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tu passes une référence en argument à la fonction.

  9. #9
    Membre confirmé Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MonObjet & maFonction (...)
    {
    MonObjet *obj = new MonObjet ();
    ...
    return *obj;
    }
    Mais je ne vois pas l'interêt

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par harsh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MonObjet & maFonction (...)
    {
    MonObjet *obj = new MonObjet ();
    ...
    return *obj;
    }
    Mais je ne vois pas l'interêt
    Argl !! JAMAIS ! c'est une belle fuite mémoire à terme, cette chose !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MonObjet & maFonction (MonObjet& objAModifier)
    {
    ///...
    return obj;
    }

  11. #11
    Membre confirmé Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Par défaut
    Oui c'est sale, mais y a pas de fuite memoire si je detruis mon objet référé dans la fonction appelante par la suite !!!

    Et puis y'a pas d'interet a retourner un objet passé en référence dans les paramètres...

    EDIT:s'annime toujours pas mon avatar...

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Parfois, il y a un avantage, pour les operator += par exemple
    Oui, tu peux toi-même penser à effacer cet objet, ce que je veux dire, c'est qu'en indiquant pointeur, on a plus de chances de penser à l'effacer que si c'est marqué référence, surtout si ton code est utilisé par qqn d'autre

  13. #13
    Membre confirmé Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Par défaut
    tres juste, merci

  14. #14
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    Tu ne peux retourner une référence que sur des choses qui CONTINUENT d'exister en dehors de l'appel de la fonction.
    On peut distinguer:
    - donnée qui appartient à l'objet de la fonction membre qui a été appelé (peut exister avant l'appel, ou être généré pendant l'appel et gardé après l'appel)
    - donnée reçue en paramètre
    - donnée de portée plus importante (que la portée de la fonction) et à laquelle on a accès (variable globale, ...)

    Ne surtout pas allouer un objet, pour ne pas le stocker et le retourner une référence. Théoriquement on peut s'en sortir. Dans la pratique, ça pique aux yeux et tu peux être sûr que tu auras des fuites de mémoires. Car quand on renvoie des références, on promet aux utilisateurs : "ne vous occupez pas de la durée de vie de cet objet. Je promets qu'il sera maintenu en vie suffisament longtemps pour que vous fassiez vos affaires. Je vous promets qu'il sera libéré au moment oppurtun."
    Si tu es dans cette situation, c'est que tu dois renvoyer un ponteur (perso, j'aime bien les std::auto_ptr<> dans ce cas, au moins on signale bien que le client aura la charge de la libération).
    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...

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

Discussions similaires

  1. probleme de retour automatique.
    Par samsso2005 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 14/03/2006, 12h06
  2. [3D] Probléme de jointure entre objet sous 3DSMAX
    Par astragoth dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 11/02/2006, 01h15
  3. Problème d'éclairage d'objet superposé
    Par yuriashford dans le forum OpenGL
    Réponses: 5
    Dernier message: 10/02/2006, 09h57
  4. Réponses: 3
    Dernier message: 08/09/2005, 10h45
  5. retour d'objet par référence...
    Par sas dans le forum C++
    Réponses: 15
    Dernier message: 28/05/2005, 17h54

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