A voir également:
- [C++] return par référence
- Reference pto - Accueil - Box & Connexion Internet
- Le compte reference est actuellement verrouillé - Forum DNS
- Différence entre note conceptuelle et termes de référence - Forum Gestion de projet
- La référence n'est pas valide excel - Forum Excel
- Compte verrouillé à l'ouverture de Windows ✓ - Forum Windows
11 réponses
Justement, le passage par référence évite d'utiliser les pointeurs, qui appartiennent plus au monde du C.
Pourquoi les aurait-on ajouter dans le langage sinon ?
Les références permettent notamment d'utiliser des pointeurs comme des objets, en évitant la copie qui peut être longue et non voulue dans certains cas.
Si tu n'as pas de problème avec ton code initial :
double& MaClasse::MaMethode()
{
double* a=new double(2);
return *a;
}
Tu pourras toujours libérer la mémoire plus tard:
double& d = MonInstance.MaMethode ();
delete &d; // prend l'adresse de d.
Petite précision: a la sortie de la méthode, ce n'est pas le double qui est perdu, c'est le pointeur vers un double.
Pourquoi les aurait-on ajouter dans le langage sinon ?
Les références permettent notamment d'utiliser des pointeurs comme des objets, en évitant la copie qui peut être longue et non voulue dans certains cas.
Si tu n'as pas de problème avec ton code initial :
double& MaClasse::MaMethode()
{
double* a=new double(2);
return *a;
}
Tu pourras toujours libérer la mémoire plus tard:
double& d = MonInstance.MaMethode ();
delete &d; // prend l'adresse de d.
Petite précision: a la sortie de la méthode, ce n'est pas le double qui est perdu, c'est le pointeur vers un double.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
9 juil. 2006 à 20:38
9 juil. 2006 à 20:38
Salut.
Je vais pas t'apporter grand chose.
Mais je sais que j'ai le même problème. Normalement, le compilateur te renvoi un warning comme quoi tu retourne une référence locale.
Moi, je me satisfait du peux de fuite mémoire que cela entraine.
D'un autre coté, je ne voi pas ton intéret à retourner un double&
moi je retourne des double* afin de retourner des tableaux
En fait, pour répondre plus précisemment à ta question, tu as une fuite de mémoire.
la valeur retourné si elle n'est pas affecter est perdu, mais la mémoire n'est pas libérer
Je vais pas t'apporter grand chose.
Mais je sais que j'ai le même problème. Normalement, le compilateur te renvoi un warning comme quoi tu retourne une référence locale.
Moi, je me satisfait du peux de fuite mémoire que cela entraine.
D'un autre coté, je ne voi pas ton intéret à retourner un double&
moi je retourne des double* afin de retourner des tableaux
En fait, pour répondre plus précisemment à ta question, tu as une fuite de mémoire.
la valeur retourné si elle n'est pas affecter est perdu, mais la mémoire n'est pas libérer
Salut Char Snipeur,
"moi je retourne des double* afin de retourner des tableaux "
Justement, puisqu'on parle de ça, j'ai aussi une difficulté là !
On m'a dit qu'il n'y avait pas de différence entre un tableau dynamique et un pointeur (ou peut être même un pointeur de pointeur, je ne sais plus)...
Mais alors, comment on fait si on veut rajouter un élément (équivalent à un push_back sur vector) ?
Si j'ai bien compris:
double* a=new double(3);
C'est un peu comme:
a[0]=3;
Mais alors si je veux rajouter un élément à mon "tableau" comme si c'était un vector<double> ?
A+
"moi je retourne des double* afin de retourner des tableaux "
Justement, puisqu'on parle de ça, j'ai aussi une difficulté là !
On m'a dit qu'il n'y avait pas de différence entre un tableau dynamique et un pointeur (ou peut être même un pointeur de pointeur, je ne sais plus)...
Mais alors, comment on fait si on veut rajouter un élément (équivalent à un push_back sur vector) ?
Si j'ai bien compris:
double* a=new double(3);
C'est un peu comme:
a[0]=3;
Mais alors si je veux rajouter un élément à mon "tableau" comme si c'était un vector<double> ?
A+
gaby10
Messages postés
445
Date d'inscription
vendredi 25 novembre 2005
Statut
Membre
Dernière intervention
3 février 2013
58
10 juil. 2006 à 13:04
10 juil. 2006 à 13:04
double& MaClasse::MaMethode()
{
double* a=new double(2);
return *a;
}
salut est ce que tu n'es pas en train de retourner la reference a un objet qui est decedé à la fin de ta procedure.Je pense en faisant un truc de ce genre cela resoud le probleme
double *b;
double& MaClasse::MaMethode()
{
double* a=new double(2);
b=a;
return *b;
}
{
double* a=new double(2);
return *a;
}
salut est ce que tu n'es pas en train de retourner la reference a un objet qui est decedé à la fin de ta procedure.Je pense en faisant un truc de ce genre cela resoud le probleme
double *b;
double& MaClasse::MaMethode()
{
double* a=new double(2);
b=a;
return *b;
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
10 juil. 2006 à 16:30
10 juil. 2006 à 16:30
Oui, c'est sur, tu passes par une variable globale.
mais à ce moment la, tu risque de créer des liens bizard entre varible...
en effet, tableau et pointeur, c'est pareil.
par exemple, tu peux faire :
*(a+3)
c'est équivalent à a[3].
Pour les tableau, c'est
a=new double[3];
pour un tableau à 3 cases
ensuite, tu doi pouvoir faire un
a=new double[4];
pour ajouter un élement, mais je ne suis pas sur de la copie des valeurs.
En fait, à quoi te sert ton double& ?
mais à ce moment la, tu risque de créer des liens bizard entre varible...
en effet, tableau et pointeur, c'est pareil.
par exemple, tu peux faire :
*(a+3)
c'est équivalent à a[3].
Pour les tableau, c'est
a=new double[3];
pour un tableau à 3 cases
ensuite, tu doi pouvoir faire un
a=new double[4];
pour ajouter un élement, mais je ne suis pas sur de la copie des valeurs.
En fait, à quoi te sert ton double& ?
gaby10
Messages postés
445
Date d'inscription
vendredi 25 novembre 2005
Statut
Membre
Dernière intervention
3 février 2013
58
11 juil. 2006 à 11:05
11 juil. 2006 à 11:05
à quoi te sert ton double& ?
pouyr dire que je retourne une reference à une variable
pouyr dire que je retourne une reference à une variable
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
11 juil. 2006 à 12:57
11 juil. 2006 à 12:57
Ok, je comprend quand la variable fait partie de la class, genre
struct A{double a;...}
double& A::var(){return a;}
te permet de faire directement
A.var()=3;
mais si tu crée la variable dans la fonction, je ne voi pas l'intéret.
struct A{double a;...}
double& A::var(){return a;}
te permet de faire directement
A.var()=3;
mais si tu crée la variable dans la fonction, je ne voi pas l'intéret.
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
11 juil. 2006 à 17:04
11 juil. 2006 à 17:04
Oui, je ne comprend pas pourquoi tu veux retourner l'objet et non pas le pointeur vers l'objet.
Tu préfères peut être les points aux flêches :-) ?
Plus sérieusement, en récupérant le pointeur vers l'objet, au moins tu pourras le détruire plus tard.
Tu préfères peut être les points aux flêches :-) ?
Plus sérieusement, en récupérant le pointeur vers l'objet, au moins tu pourras le détruire plus tard.
Un étudiant avait le même problème et il est tombe sur ce thread, ou la réponse n'avait pas été fournie !
Juste pour les suivants,,, ;-)
Juste pour les suivants,,, ;-)
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
25 sept. 2008 à 15:15
25 sept. 2008 à 15:15
Je ne trouve ça quand même pas très propre du point de vue "bonne manière" de faire ainsi.
L'utilisateur qui utilise la fonction n'est pas forcément au courant de la manière dont est faite la fonction.
Si il récupère la variable dans une donnée "classique" (ce qui est faisable)
double a=MonInstance.MaMethode ();
alors là il y a bien un problème de mémoire que l'on ne peut rendre.
Et de toute manière un tel utilisateur ignorant si il y a un new ou pas ne sait pas si il doit libérer la mémoire.
MaMethode() peut très bien retourné une référence à une variable de MonInstance qui n'utilise alors pas de new (ou carement à une variable globale).
En revanche, si on retourne un pointeur, par convention on peut s'attendre à avoir à le libérer.
L'utilisateur qui utilise la fonction n'est pas forcément au courant de la manière dont est faite la fonction.
Si il récupère la variable dans une donnée "classique" (ce qui est faisable)
double a=MonInstance.MaMethode ();
alors là il y a bien un problème de mémoire que l'on ne peut rendre.
Et de toute manière un tel utilisateur ignorant si il y a un new ou pas ne sait pas si il doit libérer la mémoire.
MaMethode() peut très bien retourné une référence à une variable de MonInstance qui n'utilise alors pas de new (ou carement à une variable globale).
En revanche, si on retourne un pointeur, par convention on peut s'attendre à avoir à le libérer.
25 sept. 2008 à 13:56