free ou pas avant de quitter? [C] - C - Programmation
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.
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
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!
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é ).
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 ?
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());
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.
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 )
Marsh Posté le 12-09-2005 à 08:55:45
Et puis, windows rame déjà bien assez tout seul
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.
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.
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.