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

  FORUM HardWare.fr
  Programmation
  C++

  delete d'une référence

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

delete d'une référence

n°1885909
frenchtouc​co
Posté le 19-05-2009 à 08:08:25  profilanswer
 

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.
mood
Publicité
Posté le 19-05-2009 à 08:08:25  profilanswer
 

n°1885940
Joel F
Real men use unique_ptr
Posté le 19-05-2009 à 09:33:04  profilanswer
 

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

n°1887312
frenchtouc​co
Posté le 24-05-2009 à 11:46:33  profilanswer
 

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.
n°1887335
ushu
Posté le 24-05-2009 à 13:11:16  profilanswer
 

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.

n°1887363
frenchtouc​co
Posté le 24-05-2009 à 16:00:15  profilanswer
 

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.
n°1887366
Joel F
Real men use unique_ptr
Posté le 24-05-2009 à 16:30:24  profilanswer
 

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

n°1887367
jesus_chri​st
votre nouveau dieu
Posté le 24-05-2009 à 16:43:31  profilanswer
 

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
n°1887370
frenchtouc​co
Posté le 24-05-2009 à 17:06:27  profilanswer
 

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.
n°1887374
Joel F
Real men use unique_ptr
Posté le 24-05-2009 à 17:31:58  profilanswer
 

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

n°1887379
frenchtouc​co
Posté le 24-05-2009 à 18:00:46  profilanswer
 

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.
mood
Publicité
Posté le 24-05-2009 à 18:00:46  profilanswer
 

n°1887386
Joel F
Real men use unique_ptr
Posté le 24-05-2009 à 19:03:45  profilanswer
 

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

n°1887387
frenchtouc​co
Posté le 24-05-2009 à 19:10:38  profilanswer
 

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.
n°1887389
Joel F
Real men use unique_ptr
Posté le 24-05-2009 à 19:29:31  profilanswer
 

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
n°1887392
frenchtouc​co
Posté le 24-05-2009 à 19:39:59  profilanswer
 

ça c'est sick quand même


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
n°1887397
Joel F
Real men use unique_ptr
Posté le 24-05-2009 à 19:50:24  profilanswer
 

je le repete. Arretez de croire, benchez :o

n°1887400
frenchtouc​co
Posté le 24-05-2009 à 20:02:56  profilanswer
 

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.
n°1887416
jesus_chri​st
votre nouveau dieu
Posté le 24-05-2009 à 21:10:06  profilanswer
 

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

n°1887418
Joel F
Real men use unique_ptr
Posté le 24-05-2009 à 21:13:55  profilanswer
 

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.

n°1887419
jesus_chri​st
votre nouveau dieu
Posté le 24-05-2009 à 21:16:11  profilanswer
 

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

n°1887420
Joel F
Real men use unique_ptr
Posté le 24-05-2009 à 21:21:42  profilanswer
 

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


Message édité par Joel F le 24-05-2009 à 21:22:23
n°1890234
jesus_chri​st
votre nouveau dieu
Posté le 02-06-2009 à 07:08:15  profilanswer
 

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

n°1890235
Joel F
Real men use unique_ptr
Posté le 02-06-2009 à 07:09:31  profilanswer
 

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

n°1890591
jesus_chri​st
votre nouveau dieu
Posté le 02-06-2009 à 21:10:55  profilanswer
 

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

n°1890730
Glock 17Pr​o
Posté le 03-06-2009 à 11:01:22  profilanswer
 

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
n°1890731
Joel F
Real men use unique_ptr
Posté le 03-06-2009 à 11:02:00  profilanswer
 

Glock 17Pro a écrit :

Le C est plus rapide.


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

n°1890735
Glock 17Pr​o
Posté le 03-06-2009 à 11:04:59  profilanswer
 

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
 

n°1890747
Joel F
Real men use unique_ptr
Posté le 03-06-2009 à 11:22:23  profilanswer
 

[: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
n°1890757
Glock 17Pr​o
Posté le 03-06-2009 à 11:36:12  profilanswer
 

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

n°1890771
Joel F
Real men use unique_ptr
Posté le 03-06-2009 à 11:47:16  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


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

  delete d'une référence

 

Sujets relatifs
pointeur vs reference en retour de fonction [Linker error] undefined reference to `RngStream::RngStream(char con
rvalue referenceRéférence ou pointeurs?
delete fichier csvretour de fonction par référence et chainage d'opération
Référence nulleDelete avec Jointure [Résolu]
Formule référence autre classeur...new & delete customisé et destructeur qui foire
Plus de sujets relatifs à : delete d'une référence


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