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é.
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é.
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).
On peut voir la fonction en question ?
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Voici la fonction qui crée l objet:
et l appel de la fonction:
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; } }
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!
Code : Sélectionner tout - Visualiser dans une fenêtre à part H5File* file_obj = HDF5_Open(file_Name, WRITE_DATA);
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.
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
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 MonObjet *monObjet = new MonObjet();
EDIT: pourquoi mon avatar il s'annime pas![]()
effectivement, j ai regle le probleme, mais sinon, comment fait on pour retourner un objet par reference?
Tu passes une référence en argument à la fonction.
Mais je ne vois pas l'interêt
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; }![]()
Argl !! JAMAIS ! c'est une belle fuite mémoire à terme, cette chose !Envoyé par harsh
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 MonObjet & maFonction (MonObjet& objAModifier) { ///... return obj; }
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...
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![]()
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...
Partager