[C++] gestion de la mémoire pour une fonction renvoyant un pointeur

gestion de la mémoire pour une fonction renvoyant un pointeur [C++] - C++ - Programmation

Marsh Posté le 27-09-2008 à 21:26:04    

Bonjour à tous,
 
Je suis devant un os depuis quelques jours et c'est pour cela que j'ouvre ce sujet. J'apprends depuis 2 mois le C++ et j'arrive pas à régler un petit problème de la gestion dynamique de ma mémoire lors d'un renvoi de pointeur d'une fonction.
 
Pour être plus explicite, voici mon code simplifié :
 

Code :
  1. class A{};
  2. class B
  3. {
  4.       A * MaFonction()
  5.       {
  6.              A * monpointeur = new A();
  7.              return monpointeur;
  8.       }
  9. };
  10. main
  11. {
  12.       B monobjet();
  13.       A * p;
  14.       p = monobjet.MaFonction();
  15. }


Vous aurez donc compris que mon problème vient de la fuite mémoire dû à la création ligne 7 d'un pointeur qui n'a pas de delete ...
 
Je pense que la solution pourrait se trouver dans le destructeur de A mais je n'en suis pas sûr. Donc si quelqu'un pouvait m'orienter sur la solution, cela serait très sympa :)  
 
Merci d'avance :jap:


Message édité par infeneon le 27-09-2008 à 23:13:26
Reply

Marsh Posté le 27-09-2008 à 21:26:04   

Reply

Marsh Posté le 28-09-2008 à 10:33:52    

Bonjour,
 
effectivement, il faut libérer la mémoire après utilisation:
je ferais plutôt comme ceci:

Code :
  1. class A{};
  2. class B
  3. {
  4.     A * monpointeur;
  5.     A * MaFonction()
  6.     {
  7.         monpointeur = new A();
  8.         return monpointeur;
  9.     }
  10.     void LibereMemoire()
  11.     {
  12.         delete A;
  13.     }
  14. };
  15. main
  16. {
  17.     B monobjet;
  18.     A * p;
  19.     p = monobjet.MaFonction();
  20. /*
  21.     les traitements ...
  22. */
  23.     monobjet.LibereMemoire();
  24. }

Reply

Marsh Posté le 28-09-2008 à 10:58:32    

parthaon a écrit :

<...du code de merde...>


et puis quoi encore ?
tu as testé ton code au moins ?
 
la solution est simple: faire un "delete p" quand il a plus besoin du pointeur.


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 28-09-2008 à 11:42:30    

Utiliser des shared_ptr ou des auto_ptr me parait aussi un peu mieux que de se balader avec des pointeurs le cul à l'air partout :o

Reply

Marsh Posté le 28-09-2008 à 12:46:48    

Joel F a écrit :

Utiliser des shared_ptr ou des auto_ptr me parait aussi un peu mieux que de se balader avec des pointeurs le cul à l'air partout :o


 :jap:

Reply

Marsh Posté le 28-09-2008 à 12:48:36    

Joel F a écrit :

Utiliser des shared_ptr ou des auto_ptr me parait aussi un peu mieux que de se balader avec des pointeurs le cul à l'air partout :o


ce serait effectivement la meilleur solution, mais vu la gueule de son "main", j'y crois pas trop...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 28-09-2008 à 12:49:59    

désolé KangOl, mais j'ai testé mon code et il fonctionne très bien (de plus je pense avoir quelques années d'expérience en C++).
Si on ne peut pas poster pour être utile sans se faire insulter par des pignoufs, il vaut mieux aller aider ailleurs...

Reply

Marsh Posté le 28-09-2008 à 12:58:48    

parthaon a écrit :

désolé KangOl, mais j'ai testé mon code et il fonctionne très bien (de plus je pense avoir quelques années d'expérience en C++).
Si on ne peut pas poster pour être utile sans se faire insulter par des pignoufs, il vaut mieux aller aider ailleurs...


Si tu l'avais testé tu verrais 2 grosses fautes (d'étourderie)


Message édité par sligor le 28-09-2008 à 12:59:17
Reply

Marsh Posté le 28-09-2008 à 13:00:53    

parthaon a écrit :

désolé KangOl, mais j'ai testé mon code et il fonctionne très bien (de plus je pense avoir quelques années d'expérience en C++).
Si on ne peut pas poster pour être utile sans se faire insulter par des pignoufs, il vaut mieux aller aider ailleurs...


Hey, je ne te permet pas de m'insulté !
 
1/ ton code ne compile même pas
2/ "delete A" ?? et puis quoi encore ?
3/ et il se passe quoi si j'appelle deux fois la méthode "MaFonction" ?
4/ c'est quoi ce "main" ?
 


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 28-09-2008 à 14:29:35    

Merci pour vos réponses :)  
 
J'ai oublié de mentionner que je ne voulais pas utiliser les smart pointeurs ni une autre fonction pour libérer la mémoire pour éviter de surcharger mon main ...

Reply

Marsh Posté le 28-09-2008 à 14:29:35   

Reply

Marsh Posté le 28-09-2008 à 14:31:15    

KangOl a écrit :


Hey, je ne te permet pas de m'insulté !
 
1/ ton code ne compile même pas
2/ "delete A" ?? et puis quoi encore ?
3/ et il se passe quoi si j'appelle deux fois la méthode "MaFonction" ?
4/ c'est quoi ce "main" ?
 


quelques précisions :
 
1/ pour KangOl qui se sent insulté : ce n'est pas moi qui ait écrit "<...du code de merde...>" après mon message  
 
2/ pour sligor : je l'ai testé, mais pas sous la forme simplifiée sous laquelle j'ai répondu (j'ai de façon classique un fichier .cpp, un .h, etc).  
Il fonctionne très bien sous C++Builder, sans augmentation de mémoire allouée à chaque appel.
 
Je l'ai rédigé ainsi dans ma réponse pour coller à la mise en forme de infeneon. Il n'est donc pas impossible qu'il y ait des fautes d'étourderie (merci de me signaler lesquelles)
 
 

Reply

Marsh Posté le 28-09-2008 à 17:41:01    

infeneon a écrit :

Merci pour vos réponses :)  
 
J'ai oublié de mentionner que je ne voulais pas utiliser les smart pointeurs ni une autre fonction pour libérer la mémoire pour éviter de surcharger mon main ...


 
tellement mieux de se tirer une balle dans le pied que de faire #include <auto_ptr> ...

Reply

Marsh Posté le 28-09-2008 à 23:42:24    

J'ai précisé que j'apprenais le C++ et je voulais savoir si c'était possible de ne pas utiliser un bazooka (c'est à dire les smarts pointeurs) pour détruire un insecte ... Problème auquel il n'y a donc pas de solution apparemment  :(

Reply

Marsh Posté le 29-09-2008 à 08:32:47    

bah si: delete monobjet
 
Mais les smarts pointeurs ne sont pas des bazookas et sont totalement adaptés à ton problème.
Au contraire, quand on apprend il vaut mieux d'abord les utiliser sur des problèmes simples. ;)


Message édité par sligor le 29-09-2008 à 08:33:06
Reply

Marsh Posté le 29-09-2008 à 10:20:21    

ok je vais me pencher sur les smarts pointeurs.
 
Par contre, un delete monobjet, ne libérera pas la mémoire occupée quand j'ai fait A * monpointeur = new A();
 
Donc la meilleure solution est de parthaon même si elle ne me convient qu'à moitié vu qu'elle surcharge mon main :(

Reply

Marsh Posté le 29-09-2008 à 10:50:19    

non mais oh v_v
 

Code :
  1. class A{};
  2. class B
  3. {
  4.       A * MaFonction()
  5.       {
  6.              A * monpointeur = new A();
  7.              return monpointeur;
  8.       }
  9. };
  10. main
  11. {
  12.       B monobjet();
  13.       A * p;
  14.       p = monobjet.MaFonction();
  15.      // babababa
  16.      delete p;
  17. }


 
Arretons le touchage de nouilles merci.

Reply

Marsh Posté le 29-09-2008 à 11:00:22    

Le problème, selon moi est que tu crées 2 pointeurs (avec le A * monpointeur = new A(); et le A * p; ) et que tu n'en delete qu'un non ?
 
Le premier n'a donc jamais eu de delete.

Message cité 2 fois
Message édité par infeneon le 29-09-2008 à 11:01:09
Reply

Marsh Posté le 29-09-2008 à 11:03:58    

infeneon a écrit :

Le problème, selon moi est que tu crées 2 pointeurs (avec le A * monpointeur = new A(); et le A * p; ) et que tu n'en delete qu'un non ?
 
Le premier n'a donc jamais eu de delete.


non
Il n'y en a qu'un seul.
un new et un delete.


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 29-09-2008 à 11:23:11    

infeneon a écrit :

Le problème, selon moi est que tu crées 2 pointeurs (avec le A * monpointeur = new A(); et le A * p; ) et que tu n'en delete qu'un non ?
 
Le premier n'a donc jamais eu de delete.


 
comem l'a dit Kangol à chaque new son delete.
Déclarer une variable de type pointeur ne veut pas dire que tu as allouée de la mémoire

Reply

Marsh Posté le 29-09-2008 à 11:25:42    

Oh oui pardon. C'est le matin :D  
 
Mais par contre, pour être propre, c'est l'obet qui fait le new qui doit faire le delete (enfin c'est ce que j'ai appris ...) :P
 
Donc pas d'autre moyen que d'encombrer mon main d'une fonction qui libère la mémoire ...

Message cité 1 fois
Message édité par infeneon le 29-09-2008 à 11:26:50
Reply

Marsh Posté le 29-09-2008 à 11:26:38    

utiliser des smart_pointeur ...
 
et arrete avec cette histoire d'encombrer le main, ca veut rien dire.
T'as le droit de fair eplusieurs fichiers aussi :o le Mo coute pas cher :o

Reply

Marsh Posté le 29-09-2008 à 11:27:25    

Sauf quand tu fais de l'embarquer .......

Reply

Marsh Posté le 29-09-2008 à 11:37:03    

infeneon a écrit :


Mais par contre, pour être propre, c'est l'obet qui fait le new qui doit faire le delete (enfin c'est ce que j'ai appris ...) :P


Non, ça c'est quand l'objet qui fait le new possède l'objet.  
Or ici l'objet qui fait le new ne possède plus référence de l'objet, il "le donne", donc ce n'est pas à lui de le détruire, il délègue la responsabilité.
C'est pour cela qu'on conseille les smart pointeurs car il permettent de gérer cette délégation de façon plus sûre avec moins de risque d'oubli.

Reply

Marsh Posté le 29-09-2008 à 11:49:09    

infeneon a écrit :

Sauf quand tu fais de l'embarquer .......


bha tu fais du C alors :o


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 29-09-2008 à 11:52:07    

De nos jours les compilateurs optimisent très bien le code, je ne suis pas sûr que la différence soit énorme.

Reply

Marsh Posté le 29-09-2008 à 11:57:05    

peut etre, j'ai jamais fait d'embarqué


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 29-09-2008 à 12:06:24    

L'embarquer évolue en ce moment (des processeurs utilisant le cache sont sur le marché par exemple ce qui est un assez grand pas quand on voit qu'Arianne tourne avec des processeurs d'il y a 20 ans ...)
 
Donc le C ne va plus suffire même pour de l'embarquer dans les années à venir.
 
Sinon, pour en revenir au ch'tit problème, merci sligor pour cet éclaircissement :)  
 
Je vais essayer de me débrouiller avec tout ça même si je reste un peu sur ma faim ...
 
Merci.
 
Edit : juste une remarque :

KangOl a écrit :

peut etre, j'ai jamais fait d'embarqué


KangOl a écrit :


bha tu fais du C alors :o


C'est un peu contradictoire non ?


Message édité par infeneon le 29-09-2008 à 12:07:51
Reply

Marsh Posté le 29-09-2008 à 12:33:03    

non.


---------------
Python Python Python
Reply

Marsh Posté le 29-09-2008 à 12:57:34    

infeneon a écrit :

Sauf quand tu fais de l'embarquer .......


je parlais du Mo de source [:dawa]
 
et je fais du C++ pour l'embarqué avec des projets de plusieurs Kilo-fichiers ... ça pose pas d epb :o
 
Anyway, si tu fais de l'embarqué,le concept même de new/delete est à proscrire au profit justement de pointeur managé comme les smart_pointer :o

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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