fonction qui retourne un pointeur

fonction qui retourne un pointeur - C++ - Programmation

Marsh Posté le 05-04-2007 à 21:41:32    

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

Reply

Marsh Posté le 05-04-2007 à 21:41:32   

Reply

Marsh Posté le 05-04-2007 à 22:55:11    

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

Reply

Marsh Posté le 05-04-2007 à 22:59:39    

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.

Reply

Marsh Posté le 06-04-2007 à 09:18:46    

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
Reply

Marsh Posté le 06-04-2007 à 10:09:18    

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

Reply

Marsh Posté le 06-04-2007 à 14:34:25    

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.

Reply

Marsh Posté le 06-04-2007 à 16:20:53    

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.

Reply

Marsh Posté le 07-04-2007 à 15:32:36    

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

Reply

Marsh Posté le 07-04-2007 à 22:17:29    

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
Reply

Marsh Posté le 07-04-2007 à 22:22:17    

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

Reply

Marsh Posté le 07-04-2007 à 22:22:17   

Reply

Marsh Posté le 07-04-2007 à 22:34:51    

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

Reply

Marsh Posté le 07-04-2007 à 22:44:06    

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
Reply

Marsh Posté le 07-04-2007 à 22:47:55    

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

Reply

Marsh Posté le 07-04-2007 à 22:51:56    

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.

Reply

Marsh Posté le 07-04-2007 à 22:53:37    

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
Reply

Marsh Posté le 07-04-2007 à 22:59:05    

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

Reply

Sujets relatifs:

Leave a Replay

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