Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1560 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  destructeur & reference

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

destructeur & reference

n°713843
lyynx
Posté le 03-05-2004 à 04:41:38  profilanswer
 

Je vais essayer de faire simple:
 
j ai un object Alpha qui pour contient un tableau
 
je veux ecrire la fonction: Alpha& operator+(Alpha& operande);
 
le problem est le suivant.
 
si le resultat est une variable local de la fonction operator+, le  destructeur est appliqué dessus apres return, et adieu mon tableau.
 
ce que je faisais c etait de creer un objet alpha avec new et de retourner *resultat.
 
Ca marche, le seul problem c est que pour liberer la memoire ensuite je dois faire delete. et comme y a plein de calculs intermediaires je n ai pas tous les pointeurs, et donc ma mémoire explose en 10 seconde.
 
En gros je voudrais retourne un objet qui n ait pas ete instancie avec new, mais que le destructeur ne passe pas dessus...
 
...
 
 

mood
Publicité
Posté le 03-05-2004 à 04:41:38  profilanswer
 

n°713867
Joel F
Real men use unique_ptr
Posté le 03-05-2004 à 08:38:38  profilanswer
 

:heink: ???
 
deja :
 

Code :
  1. Alpha operator+( const Alpha& op1, const Alpha& op 2 )
  2. {
  3.    Alpha result;
  4.   // tes trucs
  5.   return result;
  6. }


 
et a marche trés bien, le tableau est renvoyé correctement.

n°714087
fucky_fuck
Posté le 03-05-2004 à 12:45:35  profilanswer
 

ben justement ça je l'utilise, ça marche,
 
mais je crois que dans la théorie ça ne devrait pas marcher ...
 
apres y'a aussi le  

Code :
  1. Alpha operator+( const Alpha& op1, const Alpha& op 2 )
  2.   {
  3.        Alpha result;
  4.    
  5.       // tes trucs  
  6.    
  7.       return Alpha(result);
  8.   }


à condition d'avoir défini l'op de copie ...
 
bon là je crois que ça revient au meme mais c plus beau parfois ...
 
mais bon je suis pas trop clair la dessus ... si quelqu'un savait vraiment ce serait bien cool...


Message édité par fucky_fuck le 03-05-2004 à 12:46:54
n°714096
Taz
bisounours-codeur
Posté le 03-05-2004 à 12:51:44  profilanswer
 

le constructeur de copie existe toujours sauf si tu l'as interdit (rendu privé par exemple)
 
quand tu fais un return il y a une copie sauf si ton compilateur fait l'optimisation que lui permet le standard (vc ne la fait pas par exemple)
 
donc la tu fait une copie en plus encore inutile...

n°714106
fucky_fuck
Posté le 03-05-2004 à 12:58:59  profilanswer
 

oui l'op de copie existe partout, c juste qu'un warning "as tu defini ton op de copie si ta classe en a besoin ??" c allumé au moment ou j'ai ecrit le post ...
 
c sur la destination de la copie que j'ai un doute ... il copie sur la pile, et il récupère apres non ?
 
je croyais (enfin j'ai du lire quelque part) que si tu renvoyer pas comme ça, le return marchait, mais que en gros c'était du bol ... parce que si ton objet était trop gros, tu avais une bonne chance de te prendre un core file ... pask justement il le copiait pas sur la pile ...
 
bon c clair, j'ai toujours fait le return tout con, mais j'avais quand meme dans la tete cette histoire ...
 
tu me confirme qu'en faisant le return tout con, ça marche à tout coup ?
 
PS : au fait c quoi l'optimisation que permet le standard ?


Message édité par fucky_fuck le 03-05-2004 à 13:00:44
n°714116
Taz
bisounours-codeur
Posté le 03-05-2004 à 13:07:23  profilanswer
 

éviter la recopie de la valeur de retour dans le contexte appelant

n°714202
Joel F
Real men use unique_ptr
Posté le 03-05-2004 à 14:16:19  profilanswer
 

fucky_fuck a écrit :


je croyais (enfin j'ai du lire quelque part) que si tu renvoyer pas comme ça, le return marchait, mais que en gros c'était du bol ... parce que si ton objet était trop gros, tu avais une bonne chance de te prendre un core file ... pask justement il le copiait pas sur la pile ...


 
 :heink:

n°714210
lyynx
Posté le 03-05-2004 à 14:17:39  profilanswer
 

Ok je vais essayer,
 
mais juste pour etre sur...
 
Pourquoi le code suivant marche pas ??
 

Code :
  1. Alpha Alpha::operator+(const Alpha& op 2 )
  2. {
  3.    Alpha result;
  4.   // tes trucs
  5.   return result;
  6. }


 
En général mon resultat est detruit est je me retrouve avec une reference vers rien...

n°714215
Joel F
Real men use unique_ptr
Posté le 03-05-2004 à 14:18:31  profilanswer
 

y a quoi dans ta classe Alpha ?
de quelle reference parles tu ?
 
de plus, les opérateurs binaires symmétriques sont à céclarer en fonctions globales et non pas en méthodes.


Message édité par Joel F le 03-05-2004 à 14:19:04
n°714253
myst78
Posté le 03-05-2004 à 14:36:55  profilanswer
 

Joel F a écrit :

de plus, les opérateurs binaires symmétriques sont à céclarer en fonctions globales et non pas en méthodes.


pourquoi ca ? :??:  
il me semblait que le seul a declarer en global (parce qu'on peut pas faire autrement) c'est ">>"...


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
mood
Publicité
Posté le 03-05-2004 à 14:36:55  profilanswer
 

n°714255
Taz
bisounours-codeur
Posté le 03-05-2004 à 14:37:19  profilanswer
 

parce que c'est symétrique et binaire justement

n°714309
lyynx
Posté le 03-05-2004 à 15:07:11  profilanswer
 

En gros:
 

Code :
  1. class Alpha
  2. {
  3.      int *tableau; (initialisé avec malloc)
  4.      int length;     
  5. }


 
et avec ton code aussi... Avant le return mon tableau contient le bon resultat. Et apres le return mon tableau est vide (plus precisemnt la memoire a ete ecrasee.)
 
j ai verifie, le pointeur tableau pointe toujours sur la meme addresse memoire.
 
Enfin mon destructeur:  

Code :
  1. Alpha::~Alpha
  2. {
  3.      free (tableau) 
  4. }


 
mon sentiment c est qu apres return result, le destructeur est applique sur result. les valeurs du pointeur et int, double & co etant passes en copie, ils survivent, par contre mon tableau prend cher...
 
merci


Message édité par lyynx le 03-05-2004 à 15:08:44
n°714319
Taz
bisounours-codeur
Posté le 03-05-2004 à 15:10:15  profilanswer
 

oh du C ...
 
non mais ça va bien ou quoi ?

n°714321
Taz
bisounours-codeur
Posté le 03-05-2004 à 15:11:09  profilanswer
 

Spoiler :

putain je veux mon mojo cet été, je mettrais des spoiler partout

n°714326
Joel F
Real men use unique_ptr
Posté le 03-05-2004 à 15:14:31  profilanswer
 

Taz a écrit :

Spoiler :

putain je veux mon mojo cet été, je mettrais des spoiler partout




 

Spoiler :


Ca serait pas drôle :o

n°714330
Taz
bisounours-codeur
Posté le 03-05-2004 à 15:16:33  profilanswer
 

Spoiler :

parce que ça te fait marrer ce genre de chose ? on dirait un tétraplégique qui apprends à un (encore) valide à marcher ... il va pas mettre longtemps à se tirer dans le pied

n°714331
lyynx
Posté le 03-05-2004 à 15:17:04  profilanswer
 

Taz a écrit :

oh du C ...
 
non mais ça va bien ou quoi ?


 
bon visiblement j ai fait quelque chose qui fallait pas ...
je suppose que je dois utiliser new and delete ?
 
je pensais que c etait strictement equivalent

n°714334
Joel F
Real men use unique_ptr
Posté le 03-05-2004 à 15:18:45  profilanswer
 

lyynx a écrit :

je pensais que c etait strictement equivalent


 
tu penses mal ^^
 
new et delete gére aussi les appels au constructeur/destructeur lorsque tu instancie un objet.
ce qu ne font pas malloc/free

n°714336
Taz
bisounours-codeur
Posté le 03-05-2004 à 15:19:28  profilanswer
 

lyynx a écrit :

bon visiblement j ai fait quelque chose qui fallait pas ...
je suppose que je dois utiliser new and delete ?
 
je pensais que c etait strictement equivalent

t'es marrant toi ... tu lui dit d'écrire des constructeurs/destructeur et d'utiliser malloc/free qui ne font que de l'allocation alors que les operateurs new/delete eux font en plus la construction/destruction.
 
comprends en quoi ton code est ridicule

n°714359
lyynx
Posté le 03-05-2004 à 15:42:03  profilanswer
 

si le message est : "ne pas créer d object avec malloc", çà tombe bien parceque çà n a jamais ete ni le cas ni mon intension.
 
Je n utilise malloc et free que pour mes tableaux afin de pourvoir utiliser realloc quand j ai un tableau qui change de taille.

n°714360
MrNavarro
Posté le 03-05-2004 à 15:43:12  profilanswer
 

t'as essaye ca:
Alpha Alpha::operator+(const Alpha& op 2 )  
  {  
       Alpha result = new Alpha();  
     
      // tes trucs  
     
      return result;  
  }
 
??

n°714361
lyynx
Posté le 03-05-2004 à 15:44:23  profilanswer
 

question:
 
1 object avec 2 references.
 
si j appelle delete sur une des references, est ce que mon object est detruit, ou faut il qu il ne reste plus qu une reference pour qu il puisse etre detruit ?

n°714364
Joel F
Real men use unique_ptr
Posté le 03-05-2004 à 15:47:54  profilanswer
 

MrNavarro a écrit :

t'as essaye ca:
Alpha Alpha::operator+(const Alpha& op 2 )  
  {  
       Alpha result = new Alpha();  
     
      // tes trucs  
     
      return result;  
  }
 
??


 
 
Putain, ca vaut presque FORTUNE ca

n°714366
Joel F
Real men use unique_ptr
Posté le 03-05-2004 à 15:48:12  profilanswer
 

lyynx a écrit :

si le message est : "ne pas créer d object avec malloc", çà tombe bien parceque çà n a jamais ete ni le cas ni mon intension.
 
Je n utilise malloc et free que pour mes tableaux afin de pourvoir utiliser realloc quand j ai un tableau qui change de taille.


 
std::vector est ton ami.

n°714367
myst78
Posté le 03-05-2004 à 15:48:17  profilanswer
 

lyynx a écrit :

question:
 
1 object avec 2 references.
 
si j appelle delete sur une des references, est ce que mon object est detruit, ou faut il qu il ne reste plus qu une reference pour qu il puisse etre detruit ?


ui il sera detruit, et ta deuxieme ref pointera sur n'importe quoi...


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
n°714368
lyynx
Posté le 03-05-2004 à 15:48:19  profilanswer
 

MrNavarro a écrit :

t'as essaye ca:
Alpha Alpha::operator+(const Alpha& op 2 )  
  {  
       Alpha result = new Alpha();  
     
      // tes trucs  
     
      return result;  
  }
 
??


 
ca ca marche... mais il y a un hic:
 
qui dit new dit delete...
 
hors si je fais (a+a)+a
 
le resultat de (a+a) n est jamais detruit...
 
a moins que je ne decide que + detruit les operandes... c'est bourain, peu ellegant... mais çà va sans doute etre ce que je vais finallement faire.
 
dans ce cas il faut aussi que fasse:
 
(a.copie()+a.copie())+a.copie()

n°714374
Joel F
Real men use unique_ptr
Posté le 03-05-2004 à 15:51:48  profilanswer
 


 
mais arreterquoi !
 
 
Alpha a = new Alpha(); <<-- n'importequoi.
 
on a deja donner une solution propre qui marche.

n°714414
Taz
bisounours-codeur
Posté le 03-05-2004 à 16:29:53  profilanswer
 

tu vois qu'il me le faut mon spoiler-powa

n°714505
Joel F
Real men use unique_ptr
Posté le 03-05-2004 à 17:42:58  profilanswer
 

Taz a écrit :

tu vois qu'il me le faut mon spoiler-powa


 
Mais j'en veut un aussi  :sol:

n°714694
el muchach​o
Comfortably Numb
Posté le 03-05-2004 à 21:45:36  profilanswer
 

lyynx a écrit :

question:
 
1 object avec 2 references.
 
si j appelle delete sur une des references, est ce que mon object est detruit, ou faut il qu il ne reste plus qu une reference pour qu il puisse etre detruit ?


 
Ca, ça ne marche qu'avec un compteur de références. Sinon, tu dois gérer ça toi-même. delete() détruit ton objet même s'il reste des références qui pointent dessus.

n°714775
blackgodde​ss
vive le troll !
Posté le 03-05-2004 à 23:41:47  profilanswer
 

Code :
  1. struct Alpha
  2. {
  3. Alpha()
  4. {
  5. }
  6. Alpha(Alpha *a)
  7. {
  8.  delete a;
  9. }
  10. };
  11. int main()
  12. {
  13. Alpha a = new Alpha();
  14. }


 
ca me fait plaisir d'ecrire des anneries :o


---------------
-( BlackGoddess )-
n°714880
Joel F
Real men use unique_ptr
Posté le 04-05-2004 à 08:34:13  profilanswer
 

BlackGoddess a écrit :


ca me fait plaisir d'ecrire des anneries :o


 
et ben  :sarcastic:


Message édité par Joel F le 04-05-2004 à 08:34:21
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  destructeur & reference

 

Sujets relatifs
Etendre la référence d'une plage de données[PLSQL Oracle 8i] : remplir un curseur de référence
quelle reference pour outlook express[Perl] Traitement sur un array à partir de la référence de celui-ci
[C#] j'arrive pas à passer mes varibles par reference.. :'([C++] Premier constructeur & dernier destructeur spécifiques....
construire un objet sans garder de referenceun objet peut-il connaitre sa référence ?
undefined reference avec DEV c++debutant:en cpp il faut aussi un destructeur dans les structs ?
Plus de sujets relatifs à : destructeur & reference


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR