delete d'une référence

delete d'une référence - C++ - Programmation

Marsh Posté le 19-05-2009 à 08:08:25    

Hello,

 

une petite question

 

soit le code suivant :

 
Code :
  1. const int& f()
  2. {
  3. return *new int(3);
  4. }
  5. void main()
  6. {
  7. const int & b = f();
  8. delete &b;
  9. }
 

C'est valide de faire un delete d'une référence, comme c'est fait dans le code ?
valide, mais en pratique on ne code jamais comme ça ?

 

Merci !


Message édité par frenchtoucco le 19-05-2009 à 08:13:27

---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 19-05-2009 à 08:08:25   

Reply

Marsh Posté le 19-05-2009 à 09:33:04    

tu va deleter l'adresse de l'objet en référene c'est tout

Reply

Marsh Posté le 24-05-2009 à 11:46:33    

tu veux dire qu'il va y avoir une memory leak ?


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 24-05-2009 à 13:11:16    

oui c'est bon ça marche.
pour mémoire, delete a comme prototype
 

Code :
  1. void operator delete (void *p);


 
donc si tu lui passe l'adresse d'un objet créé avec new (c'est le cas ici), il va le détruire.
Tu peux t'en convaincre avec un code du genre:
 

Code :
  1. /* main.cpp */
  2. #include <iostream>
  3. using std::cout;
  4. class Toto {
  5. public:
  6. Toto()  { cout << "toto créé (" << this << " )\n"; }
  7. ~Toto() { cout << "toto détruit\n"; }
  8. };
  9. int main() {
  10. cout << "création de toto:\n";
  11. Toto& my_toto = *new Toto();
  12. cout << "destruction de toto (" << &my_toto << " ):\n";
  13. delete &my_toto;
  14. cout << "Fin du programme";
  15. }


 
tu compiles avec un coup de `make main` (avec GNU make) ou `g++ -o main main.cpp`,
chez moi ça donne:

 
  $ création de toto:
  $ toto créé (0x100150)
  $ destruction de toto (0x100150):
  $ toto détruit
  $ Fin du programme


 
Par contre j'ai rarement vu ça dans du code de prod (c'est plutôt un cas d'école). En général, on préfère garder les pointeurs,
ne serait-ce que parce que ça permet de voir tout de suite quels objets sont alloués dynamiquement.

Reply

Marsh Posté le 24-05-2009 à 16:00:15    

Merci , c'est bien ce que je pensais.
je suis surpris de voir que Joel  s'est "vautré" sur ce coup là


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 24-05-2009 à 16:30:24    

c'ets bien ce que j'ai dit ... tu vas detruire le truc que tu references .. ou alors j'ai aps compris la question la fois d'avant :E

Reply

Marsh Posté le 24-05-2009 à 16:43:31    

Joel n'avait pas tort dans sa réponse...
C'est pas très propre comme syntaxe, c'est même trompeur puisque les références sont rarement utilisées pour garder le "ownership" d'un pointeur, mais c'est conforme.


Message édité par jesus_christ le 24-05-2009 à 16:44:03
Reply

Marsh Posté le 24-05-2009 à 17:06:27    

c'est ça qui est space dans ce langage, qu'il faille jongler entre deux syntaxes , pour désigner la même chose.
ça laisse tout de même un sentiment de concept "pas très carré"


Message édité par frenchtoucco le 24-05-2009 à 17:06:55

---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 24-05-2009 à 17:31:58    

non, juste que les pointeurs sont là pour la compatibilité avec le C.
Le vrai truc à utilisé serait les références et des trucs comme des shared_ptr.
Les pointeurs sont pas aprce que personne n'a eu le courage de jeter C aux orties en créant C++.
 
Et c'est pas 'pas carré', c'ets "expressif" :o

Reply

Marsh Posté le 24-05-2009 à 18:00:46    

hum, en meme temps je trouve ça bien qu'on puisse encore coder en C-like dans une app C++, quand les perf sont recherchées, ça reste un bon compromis, le C pur c'est un peu sec pour des grosses app...


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 24-05-2009 à 18:00:46   

Reply

Marsh Posté le 24-05-2009 à 19:03:45    

les perfs du C++ sont équivalentes à celle du C hein :E

Reply

Marsh Posté le 24-05-2009 à 19:10:38    

bah à partir du moment ou le C++ wrappe les fonctions du C...je vois mal comment
cf string vs char* , IO du C++ vs IO du C, vector vs tableau à la C etc


Message édité par frenchtoucco le 24-05-2009 à 19:11:46

---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 24-05-2009 à 19:29:31    

bah rencadre toi, fais des benchs et arrete de croire ;)
j'ai passé ma thèse à bencher ce genre de chose. L'overhead est indiscernable du bruit sur le temps systeme ...

Message cité 1 fois
Message édité par Joel F le 24-05-2009 à 19:29:53
Reply

Marsh Posté le 24-05-2009 à 19:39:59    

ça c'est sick quand même


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 24-05-2009 à 19:50:24    

je le repete. Arretez de croire, benchez :o

Reply

Marsh Posté le 24-05-2009 à 20:02:56    

mais y a pas des bons liens à ce sujet sur le net? , je trouve rien de vraiment complet..


Message édité par frenchtoucco le 24-05-2009 à 20:03:06

---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 24-05-2009 à 21:10:06    

Joel F a écrit :

bah rencadre toi, fais des benchs et arrete de croire ;)
j'ai passé ma thèse à bencher ce genre de chose. L'overhead est indiscernable du bruit sur le temps systeme ...


Un lien vers ta thèse ?
Ca m'interresse :D

Reply

Marsh Posté le 24-05-2009 à 21:13:55    

C'ets sur ma page pro ;)
par contre, je sais plus si c'ets dedans ou si ca fait parti des trucs fait mais pas rédigé. Je vais vori à remettre la main sur les benchs.

Reply

Marsh Posté le 24-05-2009 à 21:16:11    

ben donne moi le titre et l'abstract au moins :)

Reply

Marsh Posté le 24-05-2009 à 21:21:42    

http://www.lri.fr/~falcou/#[[Formation%20Doctorale]]


Message édité par Joel F le 24-05-2009 à 21:22:23
Reply

Marsh Posté le 02-06-2009 à 07:08:15    

ok j'ai vu ça, merci !
Mentien TH en 2006, elles n'ont pas été supprimées les mentions sur les thèses ??

Reply

Marsh Posté le 02-06-2009 à 07:09:31    

y en a pls que 3 : rien , honorable, TH.
autant te dire que rien, t'es pas frais.
 
C'est les feloches du jury qui ont disparu formellement même si on lesz reçoit informellement

Reply

Marsh Posté le 02-06-2009 à 21:10:55    

c'est les frères Bogdanov qui ont eu "rien", non ? :D
merci pour le lien en tt cas :jap:

Reply

Marsh Posté le 03-06-2009 à 11:01:22    

Joel F a écrit :

les perfs du C++ sont équivalentes à celle du C hein :E


 
Le C est plus rapide. fait un test entre du code qui utilise du char* et un code qui utilise du string, tu verras que le le char étoilé consomme moins de millisecondes....

Message cité 1 fois
Message édité par Glock 17Pro le 03-06-2009 à 11:02:27
Reply

Marsh Posté le 03-06-2009 à 11:02:00    

Glock 17Pro a écrit :

Le C est plus rapide.


une preuve ? des benchs ? Du C++ correctment écrit n'est pas plus lent hein :E

Reply

Marsh Posté le 03-06-2009 à 11:04:59    

Prends le code que j'ai posté dans ostream vide/bidon
change la foction getTimer en string
Utilise ça comme main :
 
#include <windows.h>
int main(int arv,char** argv)
{  
    LARGE_INTEGER start, end, freq;
    double elapsed;    
    QueryPerformanceFrequency(&freq);    
    QueryPerformanceCounter(&start);    
 
 for(int i=0;i<10000;i++)
 {  
  WriteLog(DEBUG) << "debug";
   WriteLog(CRITIQUE) << "critique";  
 }
 WriteLog(FLUSH);
 
 
 QueryPerformanceCounter(&end);                                  
    elapsed = (1000.0 * (end.QuadPart - start.QuadPart)) / freq.QuadPart;  
    printf("%.0f millisecondes entre start et end.\n", elapsed);    
 system("pause" );
}
 
et constate que le cahr * consomme moins de milliseconde que le string
 
===> Le C est plus rapide que le C++, CQFD
 

Reply

Marsh Posté le 03-06-2009 à 11:22:23    

[:prozac]
si tu renvois une string par copie c'ets normal. Mais bon, en principe on renverra pas ça comme ça mais via un const &
En outre c'ets un pb qui disparait avec les rvalue reference.

 

Ensuite tu apprendras que un cas particuliers ne fait pas une preuve et que bencher de i/o n'a pas de sens.


Message édité par Joel F le 03-06-2009 à 11:23:43
Reply

Marsh Posté le 03-06-2009 à 11:36:12    

bah t'as des bench des liens qui confirme ce que tu dis ?

Reply

Marsh Posté le 03-06-2009 à 11:47:16    

Le probleme ets de trouvée une base qui a du sens. C'ets bien le pb de tout ces benchs inter-langages, tout le monde triche en ecrivant du code hyper moche.

 

* Articles ou on voit que la comparaison ets necessairement biaisée :
http://unthought.net/c++/c_vs_c++.html
http://www.objectmentor.com/resour [...] UsingC.pdf

 

* Le Technical Report sur les perfs mandées par le stadnard :
http://anubis.dkuug.dk/jtc1/sc22/w [...] /n1430.pdf

 

* En vrac :
http://groups.google.com/groups?se [...] .dfncis.de
http://news.gmane.org/gmane.comp.lang.c++.perfometer/
news://news.gmane.org/gmane.comp.lang.c++.perfometer
http://www.eventhelix.com/Realtime [...] rmance.htm
http://www.eventhelix.com/Realtime [...] mance2.htm
http://www.eventhelix.com/Realtime [...] PPCode.htm

 

En gros, sur de vrais noyeaux applciatifs, l'overhead n'est guère enorme sauf si on code comme des cochons (pas de references, copies à tout va etc)

 

EDIT :
J'oubliais le boulot de Veldhuizen :
http://ubiety.uwaterloo.ca/~tveldh [...] index.html
http://ubiety.uwaterloo.ca/~tveldh [...] echniques/
http://ubiety.uwaterloo.ca/~tveldh [...] ascon95.ps


Message édité par Joel F le 03-06-2009 à 12:12:39
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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