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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1792846
infeneon
Posté le 27-09-2008 à 21:26:04  profilanswer
 

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
mood
Publicité
Posté le 27-09-2008 à 21:26:04  profilanswer
 

n°1792981
parthaon
Posté le 28-09-2008 à 10:33:52  profilanswer
 

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

n°1792989
KangOl
Profil : pointeur
Posté le 28-09-2008 à 10:58:32  profilanswer
 

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...
n°1792994
Joel F
Real men use unique_ptr
Posté le 28-09-2008 à 11:42:30  profilanswer
 

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

n°1793012
sligor
Posté le 28-09-2008 à 12:46:48  profilanswer
 

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:

n°1793013
KangOl
Profil : pointeur
Posté le 28-09-2008 à 12:48:36  profilanswer
 

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...
n°1793014
parthaon
Posté le 28-09-2008 à 12:49:59  profilanswer
 

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

n°1793015
sligor
Posté le 28-09-2008 à 12:58:48  profilanswer
 

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
n°1793016
KangOl
Profil : pointeur
Posté le 28-09-2008 à 13:00:53  profilanswer
 

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...
n°1793032
infeneon
Posté le 28-09-2008 à 14:29:35  profilanswer
 

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

mood
Publicité
Posté le 28-09-2008 à 14:29:35  profilanswer
 

n°1793035
parthaon
Posté le 28-09-2008 à 14:31:15  profilanswer
 

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)
 
 

n°1793062
Joel F
Real men use unique_ptr
Posté le 28-09-2008 à 17:41:01  profilanswer
 

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

n°1793157
infeneon
Posté le 28-09-2008 à 23:42:24  profilanswer
 

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  :(

n°1793191
sligor
Posté le 29-09-2008 à 08:32:47  profilanswer
 

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
n°1793224
infeneon
Posté le 29-09-2008 à 10:20:21  profilanswer
 

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 :(

n°1793237
Joel F
Real men use unique_ptr
Posté le 29-09-2008 à 10:50:19  profilanswer
 

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.

n°1793239
infeneon
Posté le 29-09-2008 à 11:00:22  profilanswer
 

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
n°1793242
KangOl
Profil : pointeur
Posté le 29-09-2008 à 11:03:58  profilanswer
 

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...
n°1793247
Joel F
Real men use unique_ptr
Posté le 29-09-2008 à 11:23:11  profilanswer
 

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

n°1793249
infeneon
Posté le 29-09-2008 à 11:25:42  profilanswer
 

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
n°1793250
Joel F
Real men use unique_ptr
Posté le 29-09-2008 à 11:26:38  profilanswer
 

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

n°1793251
infeneon
Posté le 29-09-2008 à 11:27:25  profilanswer
 

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

n°1793264
sligor
Posté le 29-09-2008 à 11:37:03  profilanswer
 

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.

n°1793272
KangOl
Profil : pointeur
Posté le 29-09-2008 à 11:49:09  profilanswer
 

infeneon a écrit :

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


bha tu fais du C alors :o


---------------
Nos estans firs di nosse pitite patreye...
n°1793274
sligor
Posté le 29-09-2008 à 11:52:07  profilanswer
 

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

n°1793281
KangOl
Profil : pointeur
Posté le 29-09-2008 à 11:57:05  profilanswer
 

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


---------------
Nos estans firs di nosse pitite patreye...
n°1793291
infeneon
Posté le 29-09-2008 à 12:06:24  profilanswer
 

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
n°1793310
BenO
Profil: Chercheur
Posté le 29-09-2008 à 12:33:03  profilanswer
 

non.


---------------
Python Python Python
n°1793317
Joel F
Real men use unique_ptr
Posté le 29-09-2008 à 12:57:34  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


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

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

 

Sujets relatifs
[C] Probleme avec un PipeAppel d'une fonction mysql dans du code javascript
[c++] cherche cours / doc sur la gestion de la memoirefonction AES_ENCRYPT et UTF-8
[ASPX] [C#] Chercher et afficher une ligne dans un fichier ExcelProblème d'insertion dans une table via une interface Visual C++
[php]Insérer une table dans une autre table en fonction d'une variableUsage mémoire du serveur
[C] Erreur que je trouve pas :D 
Plus de sujets relatifs à : [C++] gestion de la mémoire pour une fonction renvoyant un pointeur


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