[C] free ou pas avant de quitter?

free ou pas avant de quitter? [C] - C - Programmation

Marsh Posté le 10-09-2005 à 07:32:07    

Hello
 
Dans un programme C si je détecte une  erreur qui provoquera l'arret du programme est il indispensable/préférable/complètement inutile de libérer la mémoire allouer avec les malloc?
 
Merci.
 

Reply

Marsh Posté le 10-09-2005 à 07:32:07   

Reply

Marsh Posté le 10-09-2005 à 08:44:05    

Avec quel système d'exploitation ? Windows ? Unix ? DOS ? et quelle version de ces systèmes ?
 
Il y a quatre groupes de Windows :
 
A. Windows 3, 3.1
B. Windows 95, 98, 98 SE, Me
C. Windows NT, 2000, 2003, XP, Vista
D. Windows CE
 
Chacun à une stratégie d'allocation et de libération mémoire différente.
 
S'il n'y a pas de plantage, s'il n'y a pas de mémoire vérouillée, si le programme sort proprement, alors tous ces Windows libérent d'eux-même la mémoire allouée (DOS aussi).
La situation est différente en cas de plantage. Seuls les Windows du groupe C sont capable de libérer leur mémoire (sauf si elle est vérouillée).
 
D'une manière générale, il est recommandé de libérer la mémoire allouée.
 
Attention, une erreur de débutant très fréquente consiste à libérer plusieurs fois le même espace de mémoire. Cela fait planter l'application. L'erreur se produit souvent quand le programmeur se croit tranquile car avant de libérer la mémoire, il teste si le pointeur est nul ou non, mais il ne sait pas ou ne fait pas attention au fait que l'instruction free() ne remet pas le pointeur à nul, d'où d'autres libérations plus tard, qui, elles, plantent.

Reply

Marsh Posté le 10-09-2005 à 09:48:23    

mart a écrit :

Dans un programme C si je détecte une  erreur qui provoquera l'arret du programme est il indispensable/préférable/complètement inutile de libérer la mémoire allouer avec les malloc?


Le langage C garanti que lorsqu'on quitte un programme 'normalement', c'est à dire avec le return de main() ou exit(), la mémoire est rendue au sytème et les fichiers sont fermés. Cette garantie ne s'applique pas aux sorties 'brutales' comme par abort() qui est appelée par la macro assert() en cas d'erreur.
 
J'ai constaté que sous DOS/Windows avec Borland C 3.1, ce genre de sortie brutale finissait par planter Borland C (impossibilité de compiler, plus de mémoire), voire la machine entière. Depuis, et parce que j'utilise beaucoup assert(), notamment en phase de mise au point, j'ai défini mon propre ASSERT()[1] qui fait une sortie 'propre' par exit().
 
A noter que atexit() permet d'installer une fonction 'utilisateur' qui sera appelée par exit(). Cette fonction peut effectuer des actions 'sanitaires' avant de sortir. (Je m'en sers pour afficher l'état de mon gestionnaire de mémoire[2] et appeler system("pause" ) quand j'utilise Dev-cpp)
 
----------------------------
[1] http://mapage.noos.fr/emdel/clib.htm
Module 'poubelle' SYS
 
[2] http://mapage.noos.fr/emdel/clib.htm
Module SYSALLOC


Message édité par Emmanuel Delahaye le 10-09-2005 à 16:52:24

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 10-09-2005 à 09:51:52    

oki, dans mon cas, c'est du exit() et du return du main! merci à vous deux et merci manu pr la réponse a la question qui venait, à savoir les fichiers. Cool!

Reply

Marsh Posté le 10-09-2005 à 09:54:42    

(sinon, le soft m'a été demandé "portable", la je code sur linux/gcc4/x86, avec un eventuel check sur macosX/gcc3.3/ppc, mais je sais pas sur quoi il tournera. le programme ne devra pas planter (tiens donc) et meme là, ben je vois mal comment lui dire liberer la mémoire. Pour le dble free, oui je sais (j'ai remarqué :)).

Reply

Marsh Posté le 10-09-2005 à 10:01:20    

mart a écrit :

(sinon, le soft m'a été demandé "portable", la je code sur linux/gcc4/x86, avec un eventuel check sur macosX/gcc3.3/ppc, mais je sais pas sur quoi il tournera. le programme ne devra pas planter (tiens donc) et meme là, ben je vois mal comment lui dire liberer la mémoire. Pour le dble free, oui je sais (j'ai remarqué :)).


Quelle est ta question précise ?
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 10-09-2005 à 15:42:00    

ben vs me dite qq tt est libéré en quittant normalement, mais je ds le cas inverrse  vois paas comment ancticiper un plantage. Ma question  concernait une erreur mais pas au nivo programmation mais au niveau mauvais usage du sofg (c'est moi qui la définie l'erreur et c'est moi qui exit());


Message édité par mart le 10-09-2005 à 15:42:25
Reply

Marsh Posté le 11-09-2005 à 17:13:47    

T'inquiète, sur tous les OS bien foutus (et tu es apparemment sur un OS bien foutu), tout est libéré quand ton programme termine. Que ce soit par un exit, par un SIGSEGV ou autre.
 
Edit : enfin quand je dis tout, je parle de la mémoire allouée par malloc et des fichiers ouverts. Si tu utilise de la mémoire partagée, elle n'est pas forcément libérée.


Message édité par matafan le 11-09-2005 à 17:15:32
Reply

Marsh Posté le 12-09-2005 à 08:51:46    

( De toute facon on s'en branlefiche, une fois le logiciel fermé, l'user pourra pas deviner que c'est notre faute si son OS rame et qu'il est obligé de rebooter tout les2jours :ange: )


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 12-09-2005 à 08:55:45    

Et puis, windows rame déjà bien assez tout seul  :whistle:


---------------
http://www.alsacreations.com , http://www.openweb.eu.org. Mon CV : http://cv.roane-irkana.net/. Exemple à ne surtout pas suivre : www.worldinternet.be
Reply

Marsh Posté le 12-09-2005 à 08:55:45   

Reply

Marsh Posté le 14-09-2005 à 12:24:34    

Perso je programme le machin sous linux mais je sais pas où il va tourner par la suite. Multi plate forme.

Reply

Marsh Posté le 14-09-2005 à 17:03:50    

De toute facon, en C, et si ton programme fait plus de quelques milliers de lignes, il est absolument impossible de liberer explicitement tout ce qui a ete alloue en cas de terminaison anormale. Laisse l'OS le faire. Ca enlevera de la complexite inutile dans ton programme.

Reply

Marsh Posté le 15-09-2005 à 13:48:58    

on est d'accord...merci..

Reply

Sujets relatifs:

Leave a Replay

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