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

  FORUM HardWare.fr
  Programmation
  C++

  fonction qui retourne un pointeur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

fonction qui retourne un pointeur

n°1539260
weblook$$
Posté le 05-04-2007 à 21:41:32  profilanswer
 

Bonjour,
 
j'ai une fonction
 
COb * f();
 
dans mon code je fais ça :
 
COb * o = f();
 
 
Pourquoi ne dois-je pas faire de delete ?
 
Merci

mood
Publicité
Posté le 05-04-2007 à 21:41:32  profilanswer
 

n°1539283
IrmatDen
Posté le 05-04-2007 à 22:55:11  profilanswer
 

Huh? Je te retourne la question?
Cet objet a peut-être un parent/propriétaire qui se chargera de le détruire lors de la destruction du parent? Sans plus de contexte... Il faut faire un delete.
Mais avec plus de contexte, peut-être pas (bien que ça ne devrait pas mettre à mal le système, mais être un raccourci pour le développeur).

n°1539286
++fab
victime du syndrome IH
Posté le 05-04-2007 à 22:59:39  profilanswer
 

Il faut lire la documentation de la fonction. En tout cas, je trouve que c'est une mauvaise chose que de retourner un pointeur s'il est interdit de le désallouer. En renvoyant alors une référence, on aurait surement éviter quelques erreurs.

n°1539378
weblook$$
Posté le 06-04-2007 à 09:18:46  profilanswer
 

Et en renvoyant une référence, que ce passe t-il exactement ?
 
un objet est déclaré à l'intérieur de la fonction, mis sur la pile, puis une référence à cet objet est renvoyé? pourquoi cette référence resterait-elle valable une fois que la fonction est terminé ? j'aurais justement tendance à penser que cette référence n'est plus valable.
 
 
PS: ça fait deux ans que je n'ai pas codé en C++, j'ai oublié certain principe de base.

Message cité 1 fois
Message édité par weblook$$ le 06-04-2007 à 09:19:23
n°1539394
Joel F
Real men use unique_ptr
Posté le 06-04-2007 à 10:09:18  profilanswer
 

boost::shared_ptr et ses confrères me semblent de bon [:aloy2]
http://boost.org/libs/smart_ptr/smart_ptr.htm
 
ca evitera de se posser cette sempiternelle question de delete ou pas

n°1539621
++fab
victime du syndrome IH
Posté le 06-04-2007 à 14:34:25  profilanswer
 

weblook$$ a écrit :

un objet est déclaré à l'intérieur de la fonction, mis sur la pile, puis une référence à cet objet est renvoyé? pourquoi cette référence resterait-elle valable une fois que la fonction est terminé ? j'aurais justement tendance à penser que cette référence n'est plus valable.


Effectivement, dans ce cas, elle n'est plus valable.
Si la variable était static, la référence serait valide.
Mais ceci n'est pas spécifique aux références, les pointeurs se comportent de manière équivalente.

n°1539712
weblook$$
Posté le 06-04-2007 à 16:20:53  profilanswer
 

un new à l'intérieur d'une fonction alloue sur de la mémoire sur le tas pourtant, donc reste valide une fois la fonction terminée.

n°1539970
weblook$$
Posté le 07-04-2007 à 15:32:36  profilanswer
 

IrmatDen a écrit :

Huh? Je te retourne la question?
Cet objet a peut-être un parent/propriétaire qui se chargera de le détruire lors de la destruction du parent? Sans plus de contexte... Il faut faire un delete.
Mais avec plus de contexte, peut-être pas (bien que ça ne devrait pas mettre à mal le système, mais être un raccourci pour le développeur).


 
hum oui probable, c'est un toolkit que j'utilise donc je sais pas trop comment c'est gauler ,( je sais y a la doc mais bon...)

n°1540065
weblook$$
Posté le 07-04-2007 à 22:17:29  profilanswer
 

Code :
  1. class A
  2. {
  3. protected:
  4. A* child;
  5. virtual A* creerEnfantUnique() = 0;
  6. };
  7. class B : public A
  8. {
  9. public:
  10. ~B();
  11. inline A* creerEnfantUnique()
  12. {
  13.  child = new B();
  14.  return child;
  15. }
  16. };
  17. B::~B()
  18. {
  19. if(child)
  20. {
  21.  delete child;
  22. }
  23. }
  24. void main()
  25. {
  26. B * parent = new B();
  27. A* enfant = parent->creerEnfantUnique();
  28. delete parent;
  29. }
 

effectivement , avec ce genre de code , pas de delete dans le main pour le pointeur retourné


Message édité par weblook$$ le 07-04-2007 à 22:43:24
n°1540070
KangOl
Profil : pointeur
Posté le 07-04-2007 à 22:22:17  profilanswer
 

faut pas retourner un pointeur mais une référence dans ce cas

mood
Publicité
Posté le 07-04-2007 à 22:22:17  profilanswer
 

n°1540074
weblook$$
Posté le 07-04-2007 à 22:34:51  profilanswer
 

Non car je me retrouverais avec  
A enfant
et le compilo broncherait à cause du virtual pure

n°1540078
++fab
victime du syndrome IH
Posté le 07-04-2007 à 22:44:06  profilanswer
 

normal, tu mens au compilateur, il se venge.
edit: (je répondais à un post effacé, pas grave)
edit2: arrête d'éditer test posts en permanence, on a pas que ça à faire de relire chaque fois tous les posts depuis le début et voir ce qui change.


Message édité par ++fab le 07-04-2007 à 22:47:02
n°1540080
KangOl
Profil : pointeur
Posté le 07-04-2007 à 22:47:55  profilanswer
 

et d'un autre coté, ton code est foireux :  
*/ child n'est pas initialisé
*/ deux appels a creerEnfantUnique et, hop, un memoryleak

n°1540084
++fab
victime du syndrome IH
Posté le 07-04-2007 à 22:51:56  profilanswer
 

Oui, et la class A est mon avis inutilisable - ou alors c'est un design plus complexe dont on en voit qu'un bout ici.
Et le test avant le delete est inutile.

n°1540087
weblook$$
Posté le 07-04-2007 à 22:53:37  profilanswer
 

Code :
  1. class A
  2. {
  3. protected:
  4. A* child;
  5. virtual A* creerEnfantUnique() = 0;
  6. };
  7. class B : public A
  8. {
  9. private:
  10. bool pourTeFairePlaisir;
  11. public:
  12. B();
  13. ~B();
  14. inline A* creerEnfantUnique()
  15. {
  16.  if(pourTeFairePlaisir)
  17.  {
  18.   child = new B();
  19.   pourTeFairePlaisir=false;
  20.  }
  21.  return child;
  22. }
  23. };
  24. B::B()
  25. {
  26. pourTeFairePlaisir = true;
  27. child = NULL;
  28. }
  29. B::~B()
  30. {
  31. if(child)
  32. {
  33.  std::cout<<"I will be back";
  34.  delete child;
  35. }
  36. }
  37. void main()
  38. {
  39. B * parent = new B();
  40. A * enfant = parent->creerEnfantUnique();
  41. delete parent;
  42. }


Message édité par weblook$$ le 07-04-2007 à 22:55:25
n°1540092
weblook$$
Posté le 07-04-2007 à 22:59:05  profilanswer
 

désolé pour les "édit" mais ça évite de laisser des erreurs inutiles


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

  fonction qui retourne un pointeur

 

Sujets relatifs
pointeur et JAVA[VBS] [résolu]Pb avec fonction STRCOMP
appliquer une fonction js a toutes balises inputFonction mysql_fetch_assoc
fonction avec table hash en parametreErreur d'accès ambigu à une fonction membre après dérivation multiple
comment utiliser cette fonctionFonction pour écrire un DWORD dans la base de registre avec VB6
Problemme sur fonction [debutant]fonction setInterval
Plus de sujets relatifs à : fonction qui retourne un pointeur


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