[C++] Fuite mémoire

Fuite mémoire [C++] - C++ - Programmation

Marsh Posté le 22-11-2007 à 11:42:53    

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 ?

Reply

Marsh Posté le 22-11-2007 à 11:42:53   

Reply

Marsh Posté le 22-11-2007 à 11:49:22    

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.

Reply

Marsh Posté le 22-11-2007 à 11:50:40    

Bah tu le delete ailleurs.
 


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

---------------
You can't start a fire with moonlight
Reply

Marsh Posté le 22-11-2007 à 11:53:07    

@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 ?

Reply

Marsh Posté le 22-11-2007 à 12:54:27    

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

Reply

Marsh Posté le 22-11-2007 à 13:56:21    

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

Reply

Marsh Posté le 22-11-2007 à 18:42:10    

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

Reply

Marsh Posté le 22-11-2007 à 19:17:23    

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.

Reply

Marsh Posté le 22-11-2007 à 19:28:20    

Reply

Marsh Posté le 22-11-2007 à 19:45:40    

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

Reply

Marsh Posté le 22-11-2007 à 19:45:40   

Reply

Marsh Posté le 22-11-2007 à 20:07:05    

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

Reply

Marsh Posté le 22-11-2007 à 20:30:31    

Ace17 a écrit :

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


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

Reply

Marsh Posté le 02-12-2007 à 19:53:40    

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
Reply

Marsh Posté le 02-12-2007 à 21:12:53    

moralité : boost:smart_array_ptr ;)

Reply

Marsh Posté le 02-12-2007 à 22:02:49    

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)

Reply

Marsh Posté le 03-12-2007 à 08:32:48    

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.

Reply

Marsh Posté le 03-12-2007 à 09:11:15    

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 ?

Reply

Marsh Posté le 03-12-2007 à 10:04:38    

oui

Reply

Marsh Posté le 05-12-2007 à 19:22:53    

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
Reply

Marsh Posté le 05-12-2007 à 22:55:57    

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

Reply

Marsh Posté le 06-12-2007 à 20:38:09    

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

Marsh Posté le 07-12-2007 à 10:41:48    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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