Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LIBRAIRIE POUR ÉVITER LES FUITES MEMOIRES


Information sur la source

Catégorie :Astuces Classé sous : fuites, malloc, free, debug, mémoire Niveau : Débutant Date de création : 20/12/2007 Date de mise à jour : 20/12/2007 17:43:27 Vu / téléchargé: 4 453 / 136

Note :
9,33 / 10 - par 3 personnes
9,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

Description

Lorsqu'on utilise fréquemment la fonction malloc() pour allouer de la mémoire, il peut arriver que l'on oublie de faire un free() ensuite. Dans ce cas là, le programme continue sans nous avertir. Cela peut-être très gênant parfois, car ce  genre d'erreur ne se voit pas facilement.

j'ai été inspiré par les sources de Jcdjcd (ses fichiers util.h et util.c).

J'ai essayé de rendre l'utilisation de ce code le + simple possible.

attention: IL FAUT COMPILER LE PROGRAMME EN MODE DEBUG POUR VOIR LE RESULTAT

- sous gcc en utilisant la commande :

"gcc -D_DEBUG -o ./Prog ./test.c ./debug.c"

- Sous visual en sélectionnant le mode DEBUG et non RELEASE

 

Source

  • // petit code avec des erreurs de malloc
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include "debug.h"
  • int main()
  • {
  • int* var = NULL;
  • int* var2 = NULL;
  • int* var3 = NULL;
  • var = (int*) malloc(sizeof(int));
  • var2 = (int*) malloc(sizeof(int));
  • // on alloue de la memoire plusieurs fois pour var3...
  • var3 = (int*) malloc(3*sizeof(int));
  • var3 = (int*) malloc(4*sizeof(int));
  • free(var);
  • free(var);
  • // on oublie volontairement de liberer la memoire pour var2 et var3...
  • _closedebug();
  • return 0;
  • }
// petit code avec des erreurs de malloc

#include <stdio.h>
#include <stdlib.h>
#include "debug.h"

int main()
{
	int* var = NULL;
	int* var2 = NULL;
	int* var3 = NULL;

	var = (int*) malloc(sizeof(int));
	
	var2 = (int*) malloc(sizeof(int));

	// on alloue de la memoire plusieurs fois pour var3...
	var3 = (int*) malloc(3*sizeof(int));
	var3 = (int*) malloc(4*sizeof(int));

	free(var);
	free(var);
	// on oublie volontairement de liberer la memoire pour var2 et var3...

	_closedebug();
	
	return 0;
}

Conclusion

Le résultat lorsqu'on compile en mode debug est l'apparition d'un fichier "log.txt" qui contient les erreurs de malloc().

Par exemple pour le source montré plus haut :

************* FICHIER LOG.TXT *************

test.c(19): liberation d'un pointeur deja nul
test.c(13): pointeur non libere (adresse: 0x6020c0, nombre d'octets: 4)
test.c(15): pointeur non libere (adresse: 0x602170, nombre d'octets: 12)
test.c(16): pointeur non libere (adresse: 0x602220, nombre d'octets: 16)

*******************************************


J'aimerais ajouter des tas d'autres test, mais avant je voudrais bien avoir votre avis sur la façon dont c'est programmé.
Pour rendre l'utilisation facile, j'ai du faire des choses un peu limites. Donc j'aimerais bien connaître votre opinion.

Ah oui, j'ai pas mal commenté le fichier debug.c
Pensez vous qu'il y a trop de commentaires, que c'est bien ? Ou qu'ils sont mal placés ?
J'essai d'apprendre à commenter un source, mais je sais pas trop comment il faut s'y prendre pour le faire bien.

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

20 décembre 2007 02:00:12 :
Première version
20 décembre 2007 17:33:22 :
- correction d'un petit bug (un pointeur n'etait pas initialisé à NULL) - mise à jour des commentaires
20 décembre 2007 17:43:27 :
Conversion des fichiers textes au format dos avec (unix2dos) car problème d'affichage sur cppfrance.com

Commentaires et avis

signaler à un administrateur
Commentaire de JCDjcd le 20/12/2007 16:32:37

quand l'utilisateur fait un free(NULL) (le second "free(var);"), il ne faut pas juste
l'enregistrer dans log.txt, mais carrement afficher un message d'erreur, et quitter
me programme, car ca ne sert a rien de continuer !

signaler à un administrateur
Commentaire de coucou747 le 21/12/2007 07:00:33

perso j'utilise valgrind pour ce genre de choses, les logs y sont tres complets :)

signaler à un administrateur
Commentaire de tnt95 le 21/12/2007 13:32:12 10/10

Je pense que le programme peut être bien utile pour les débutants commz moi mais j'ai juste un petit probléme décompression du fichier. Vos explications sont claire et pas de trop ...

Bonne continuation

signaler à un administrateur
Commentaire de shenron666 le 21/12/2007 19:46:54

JCDjcd > le second free(var) n'est pas un free(NULL) mais un free(pointeur invalide) car déjà désalloué ce qui peut générer une erreur à l'execution (runtime error) = plantage
et free(NULL) ne fait rien

signaler à un administrateur
Commentaire de JCDjcd le 24/12/2007 17:30:06

oui c'est juste...
en fait moi dans mes libraries, la variable <var> aurait ete mis a NULL pour montrer que le pointeur n'est plus valide

signaler à un administrateur
Commentaire de tit_toinou le 28/12/2007 20:04:02 10/10

code très pratique et à utiliser dans tous ses programmes ! 10/10

signaler à un administrateur
Commentaire de vaniweb le 03/03/2008 11:30:03

Il y a t-il le même outil pour un programme C++ (avec les fuites de mémoires occasionnées par les appels à new sans le delete correspondant.)
Je sais que sous Visual C++ il existe des fonctions déclarées dans ctrdgb.h qui vérifie les opérations effectuées avec le tas et détectent les fuites de mémoire. Mais est-il possible d'utiliser ses mêmes fonctions sous l'environnement Linux ? ou peut-il y avoir des librairies similaires que l'on peut utiliser sous linux ?

signaler à un administrateur
Commentaire de glipper le 03/03/2008 12:33:20

le programme gdb sous linux peut t'avertir des fuites mémoires.
C'est assez simple à utiliser pour ça il me semble.

signaler à un administrateur
Commentaire de tomka123 le 17/07/2008 12:48:56 8/10

Salut,
A propos des commentaires, évite de mettre des commentaires c++ " // " dans du code que tu compileras en c.

Certains compilos (le st20cc il me semble) peuvent générer des erreurs !
Les seuls commentaires possibles en C sont " /* */ "

A+

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Probleme d'allocation de mémoire dynamique (malloc/free) [ par PhantomPowaa ] Bonjour,J'ai un petit probleme avec les fonctions malloc et free dans certains de mes programmes. Apparement le malloc s'effectue correctement, mais a Pb d'allocation mémoire malloc [ par oz80 ] Bonjour &#224; tous, j'ai un probl&#232;me d'allocation de m&#233;moire je pense. Je d&#233;clare une variable comme ceci : <TBOD malloc (ms vc++) [ par DeadlyPredator ] Bonjour,J'ai une fonction:char*&nbsp; _fastcall strLeft(const char* lpszString, const long nLength) {&nbsp;char* lpszBuffer;&nbsp;lpszBuffer=(char*)ma Problème avec la fonction free dans visual basic. [ par tobi222 ] J'ai cr&#233;&#233; une liste chain&#233;e toute simple avec o&#249; j'alloue de la m&#233;moire dynamiquement et &#224; la fin lorsque je d&#233;trui Question sur l'allocation de mémoire... [ par kod32 ] Salut,j'ai une question concernant l'allocation de mémoire et notamment l'utilisation de la fonction malloc. Cette fonction permet de pointer vers un detection des fuites mémoire [ par kimo_100 ] j'aimerai utiliser un outil pour detecter les fuites mémoiredans mon application(en c++ sous hp ux 11).j'ai essayé avec insure,mais il ne m'a pas beau Creation fonction malloc [ par LordBob ] Bonjour a tous,voila en cours on est en train de faire un TP sur la gestion de la mémoire et on doit programmer la fonction malloc. Pour la partie thé Free() veut pas désallouer.... [ par benlustr ] Bonjour à tous, c'est encore moi Dans une fonction, j'ai deux pointeurs qui s'incrémentent dans une boucle. à la fin de la fonction, je libère les zon Mémoire dynamique et gestion d'erreur [ par Polack77 ] Bonjours, ma question serais que se passe t'il si je fais un free sur un pointeur non défini (ou défini à 0).     Je posse cette question (qui peut pa fuite de mémoire en C++ sous linux [ par vaniweb ] J'ai vu un code simple pour détecter les fuites de mémoire en C: http://www.cppfrance.com/codes/LIBRAIRIE-EVITER-FUITES-MEMOIRES_45136.aspxIl y a t-il


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.