destructeur & reference

destructeur & reference - C++ - Programmation

Marsh Posté le 03-05-2004 à 04:41:38    

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...
 
...
 
 

Reply

Marsh Posté le 03-05-2004 à 04:41:38   

Reply

Marsh Posté le 03-05-2004 à 08:38:38    

: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.

Reply

Marsh Posté le 03-05-2004 à 12:45:35    

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
Reply

Marsh Posté le 03-05-2004 à 12:51:44    

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...

Reply

Marsh Posté le 03-05-2004 à 12:58:59    

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
Reply

Marsh Posté le 03-05-2004 à 13:07:23    

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

Reply

Marsh Posté le 03-05-2004 à 14:16:19    

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:

Reply

Marsh Posté le 03-05-2004 à 14:17:39    

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...

Reply

Marsh Posté le 03-05-2004 à 14:18:31    

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
Reply

Marsh Posté le 03-05-2004 à 14:36:55    

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...
Reply

Marsh Posté le 03-05-2004 à 14:36:55   

Reply

Marsh Posté le 03-05-2004 à 14:37:19    

parce que c'est symétrique et binaire justement

Reply

Marsh Posté le 03-05-2004 à 15:07:11    

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
Reply

Marsh Posté le 03-05-2004 à 15:10:15    

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

Reply

Marsh Posté le 03-05-2004 à 15:11:09    

Spoiler :

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

Reply

Marsh Posté le 03-05-2004 à 15:14:31    

Taz a écrit :

Spoiler :

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




 

Spoiler :


Ca serait pas drôle :o

Reply

Marsh Posté le 03-05-2004 à 15:16:33    

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

Reply

Marsh Posté le 03-05-2004 à 15:17:04    

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

Reply

Marsh Posté le 03-05-2004 à 15:18:45    

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

Reply

Marsh Posté le 03-05-2004 à 15:19:28    

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

Reply

Marsh Posté le 03-05-2004 à 15:42:03    

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.

Reply

Marsh Posté le 03-05-2004 à 15:43:12    

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

Reply

Marsh Posté le 03-05-2004 à 15:44:23    

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 ?

Reply

Marsh Posté le 03-05-2004 à 15:47:54    

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

Reply

Marsh Posté le 03-05-2004 à 15:48:12    

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.

Reply

Marsh Posté le 03-05-2004 à 15:48:17    

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...
Reply

Marsh Posté le 03-05-2004 à 15:48:19    

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()

Reply

Marsh Posté le 03-05-2004 à 15:51:48    


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

Reply

Marsh Posté le 03-05-2004 à 16:29:53    

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

Reply

Marsh Posté le 03-05-2004 à 17:42:58    

Taz a écrit :

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


 
Mais j'en veut un aussi  :sol:

Reply

Marsh Posté le 03-05-2004 à 21:45:36    

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.

Reply

Marsh Posté le 03-05-2004 à 23:41:47    

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 )-
Reply

Marsh Posté le 04-05-2004 à 08:34:13    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed