begin process at 2010 02 10 11:08:07
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > LIBRAIRIE POUR ÉVITER LES FUITES MEMOIRES

LIBRAIRIE POUR ÉVITER LES FUITES MEMOIRES


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :5 205 / 153

Auteur : glipper

Ecrire un message privé
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

Les Membres Club peuvent 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

 Sources du même auteur

Source avec Zip Source avec une capture SCANDISC SIMPLE POUR LISTER LE CONTENU D'UN REPERTOIRE (+ DE...
Source avec Zip Source avec une capture GETOPENFILENAME AVEC UNE TREEVIEW + CLIQUE DROIT
Source avec Zip COURS POINTEURS
REPROGRAMMER STRLEN ET STRCPY
FONCTIONS À TAILLE VARIABLE D'ARGUMENTS

 Sources de la même categorie

SMART POINTEUR À COMPTEUR DE RÉFÉRENCE par nirgal76
POINTEUR INTELLIGENT par snpier wolf
ALIGNER TEXTE CONSOLE par CptPingu
QWERTY - AZERTY AVEC SDL, UNE ALTERNATIVE par Scheb
Source avec Zip Source avec une capture INSERER UNE ANIMATION FLASH (WIN32-DEVCPP) par gagah1

 Sources en rapport avec celle ci

[DEV-C++] CALCUL DE LA RACINE CARRÉE D'UN RÉEL par Jhep
Source avec Zip Source avec une capture [C/WIN32] INJECTION DE DLL 2 MÉTHODES (REMOTETHREAD PROPRE &... par deck_bsd
Source avec une capture STACK WATCHER par lilxam7
PROCESS DUMPER par lilxam7
Source avec Zip OUTPUTDEBUGSTRINGEX par kts_system

Commentaires et avis

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 !

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

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

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

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

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

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 ?

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.

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

Comparez les prix


HTC Hero

Entre 550€ et 550€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,686 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales