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

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Fuite mémoire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Fuite mémoire

n°1647085
inh40
Posté le 22-11-2007 à 11:42:53  profilanswer
 

Bonjour,
 
J'ai un programme C++ pour lequel j'ai une fuite mémoire. En le passant sous Valgrind, j'ai repéré ce problème :
 
char * maFonction()
{
 char * retour = new char[255];
 retour[0] = '\0';
 
 /* traitements... */
 
 if(retour[0] == '\0')
 {
  return NULL;
 }
 else
 {
  return retour;
 }
}
 
Le soucis est que je ne libère pas la mémoire, il me manque un "delete[] retour;", mais où le placer, étant donné que je veux renvoyer ce pointeur à la fonction appelant "maFonction()" ? En gros, comment libérer un pointeur alloué dynamiquement que l'on veut renvoyer en retour de la fonction ?

mood
Publicité
Posté le 22-11-2007 à 11:42:53  profilanswer
 

n°1647093
MagicBuzz
Posté le 22-11-2007 à 11:49:22  profilanswer
 

bah... tu passes ton pointeur en paramètre à ta fonction, et tu gères la mémoire dans la partie principale ?
 
c'est ce qu'il y a de plus simple en tout cas.

n°1647096
kyntriad
Posté le 22-11-2007 à 11:50:40  profilanswer
 

Bah tu le delete ailleurs.
 


Message édité par kyntriad le 22-11-2007 à 11:51:38

---------------
You can't start a fire with moonlight
n°1647097
inh40
Posté le 22-11-2007 à 11:53:07  profilanswer
 

@MagicBuzz : je pense que c'est la bonne solution, je vais voir ca.
 
@kyntriad : "retour" est défini dans "maFonction()", comment mettre le delete ailleurs ?

n°1647131
Taz
bisounours-codeur
Posté le 22-11-2007 à 12:54:27  profilanswer
 

jète toussa.
 
std::string et ça roule

n°1647190
inh40
Posté le 22-11-2007 à 13:56:21  profilanswer
 

le problème est que je n'ai pas une grande liberté sur le code :/

n°1647570
Joel F
Real men use unique_ptr
Posté le 22-11-2007 à 18:42:10  profilanswer
 

change de boite, les gens qui font encore des char* en C++ sont vraiment des incompétents

n°1647582
Ace17
Posté le 22-11-2007 à 19:17:23  profilanswer
 

Joel F a écrit :

change de boite, les gens qui font encore des char* en C++ sont vraiment des incompétents

Oui, enfin bon, le meme probleme se pose avec un tableau de int.

n°1647593
KangOl
Profil : pointeur
Posté le 22-11-2007 à 19:28:20  profilanswer
 
n°1647608
Ace17
Posté le 22-11-2007 à 19:45:40  profilanswer
 

Je l'attendais celle la ... et au return, on recopie?

mood
Publicité
Posté le 22-11-2007 à 19:45:40  profilanswer
 

n°1647616
KangOl
Profil : pointeur
Posté le 22-11-2007 à 20:07:05  profilanswer
 

et les références c'est pour les chiens ?

n°1647626
Joel F
Real men use unique_ptr
Posté le 22-11-2007 à 20:30:31  profilanswer
 

Ace17 a écrit :

Je l'attendais celle la ... et au return, on recopie?


 
reférences + pas ecrire des interfaces débiles :o

n°1651873
jojoleping​ouin
Posté le 02-12-2007 à 19:53:40  profilanswer
 

pas de new sans auto_ptr (ou en tout cas sans RAII):
http://www.gotw.ca/publications/us [...] tively.htm
 

Code :
  1. std::auto_ptr<char> maFonction()
  2. {
  3.     /* Gestion automatique de memoire, pas de leak + exception-safe*/
  4.     std::auto_ptr<char> retour (new char[255]);
  5.     retour.get()[0] = '\0';
  6.     /* Check de retour inutile, eventuellement tu peux faire un release */
  7.     return retour;
  8. }


 
edit: a oui, pas d'auto_ptr avec des tableaux. Moralite, met un std::string et t'embetes pas.

Message cité 1 fois
Message édité par jojolepingouin le 02-12-2007 à 20:08:42
n°1651903
Joel F
Real men use unique_ptr
Posté le 02-12-2007 à 21:12:53  profilanswer
 

moralité : boost:smart_array_ptr ;)

n°1651914
jojoleping​ouin
Posté le 02-12-2007 à 22:02:49  profilanswer
 

Joel F a écrit :

moralité : boost:smart_array_ptr ;)

Ah oui c'est sympas ce truc, merci je connaissais pas...
Il n'y a pas de auto_array_ptr ?
(j'ai toujours trouve les auto_*ptr plus simples a utiliser que les shared_*ptr)

n°1651970
Joel F
Real men use unique_ptr
Posté le 03-12-2007 à 08:32:48  profilanswer
 

http://boost.org/libs/smart_ptr/smart_ptr.htm
 
De mémoire, les scoped_**_ptr ont la même sémantique que les auto_**ptr.

n°1651975
Amonchakai
Posté le 03-12-2007 à 09:11:15  profilanswer
 

jojolepingouin a écrit :

pas de new sans auto_ptr (ou en tout cas sans RAII):
http://www.gotw.ca/publications/us [...] tively.htm
...


 
J'avoue que je suis assez perplexe par ce genre de truc. Il est vrai que les smart pointer sont des outils puissants mais les utiliser à chaque new, je trouve ça un peu beaucoup : ça reste quand même des objets donc ça bouffe de la mémoire, c'est plus lourd a copier... Dans la boite où j'avais bossé cet été pour mon stage ils avaient fait un RessourceManager et utilisaient des smart pointer dans tout les sens avec plein de copie de shared_ptr... J'avoue que j'ai plutôt été étonné...  
Après il est sur qu'avec les pointeurs faut faire doublement gaffe a ce que l'on fait...
 
vous aussi vous les utilisez aussi intensivement ?

n°1651992
Joel F
Real men use unique_ptr
Posté le 03-12-2007 à 10:04:38  profilanswer
 

oui

n°1653482
Dumbledore
Posté le 05-12-2007 à 19:22:53  profilanswer
 

Personnellement, je fais une utilisation très intensives des pointeurs, mais les smart_ptr et autre trucs, jamais. D'ailleurs j'ai jamais vu ce genre de trucs dans des gros projets (genre KDE 4).
 
A la main : new + delete.
 
D'ailleurs, pour ton problème, c'est très con :
 

Code :
  1. char * maFonction()
  2. {
  3. char * retour = new char[255];
  4. retour[0] = '\0';
  5. /* traitements... */
  6. if(retour[0] == '\0')
  7. {
  8.   delete retour;   // Si ça se trouve, c'est seulement ça que valgrind voulait t'indiquer
  9.   return NULL;
  10. }
  11. else
  12. {
  13.   return retour;
  14. }
  15. }
  16. int main(int argc,cahr **argv)
  17. {
  18.   char *toto = maFonction();
  19.   delete toto;   // ça ne pose pas de problème de faire un delete sur un pointeur nul.
  20. }


 
Et tant qu'à faire, en C++, on n'utilise plus tellement "NULL" qui est un héritage du C, mais directement la valeur 0 (zéro)


Message édité par Dumbledore le 05-12-2007 à 19:32:33
n°1653525
Joel F
Real men use unique_ptr
Posté le 05-12-2007 à 22:55:57  profilanswer
 

en C++ on utilsie std::string surtout :o
 
et KDE & co, c'est pas ce que j'appelerais un exemple de bonne pratique de code :o

n°1654141
neg'gwada
rafix 971
Posté le 06-12-2007 à 20:38:09  profilanswer
 

Taz a écrit :

jète toussa.

 

std::string et ça roule


[:plusun]


Message édité par neg'gwada le 06-12-2007 à 20:38:37

---------------
--- WinSplit Revolution ---
n°1654328
inh40
Posté le 07-12-2007 à 10:41:48  profilanswer
 

Pour info, j'ai réécris le code en utilisant des std::string, et ca ne fuit plus.
Merci à tous pour vos conseils.

mood
Publicité
Posté le   profilanswer
 


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

  [C++] Fuite mémoire

 

Sujets relatifs
Fuite mémoires IE6, je ne comprend pas bien[RESOLU] Supprimer/fermer une fenetre ( de la mémoire )
HELP! Comment stopper la mise en mémoire cache des vidéos FLACH CS3?Execution de progarmme en paralelle - gestion de memoire
Accéder memoire d'un processusServeur avec socket Unix + Pointeur de fonctions (contexte memoire ?)
probleme d'adresse memoire qui rend fou[EXCEL] Macro sans mémoire de cases
Detection de la quantité de mémoire viveMémoire
Plus de sujets relatifs à : [C++] Fuite mémoire


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