Dans mes programmes, je suis toujours embété par la gestion des
désallocation d'objets lorsque survient une erreur quelconque...
par exemple, lors de la construction d'un objet important pour le
programme, il y a échec, je dois détruire tous les objets créés
auparavant afin de quitter proprement.. celà demande toujours des tests
ennuyeux, et de plus, la liste de ces objets à détruire n'est jamais la
même suivant l'endroit du programme où l'erreur survient.
J'ai donc dans l'idée de programmer un petit gestionnaire d'erreur, je
pensais à un objet qui contiendrait la liste des objets crées
(pointeurs) ainsi qu'un pointeur vers leur destructeur respecif et un
message char* approprié (tel que le nom etc...)
ainsi lors d'une erreur, il serait "facile" de détruire un à un les
objets alloués en affichant ça à l'utilisateur... :
Cependant je pense à une chose délicate, afin d'etre le plus général
possible mon gestionnaire ne doit pas accumuler une liste d'objets sans
ordre... en effet il se peut que certains objets soient dépendant
d'autres, et que leur destructeur requiert qu'un des autres objets soit
encore en vie... il faudrait donc une sorte d'arborescence d'objets à
tuer...
Quelqu'un à -t-il déjà fait quelque chose de similaire ? avez-vous
une/des bonne(s) idée(s) à me proposer ?
En principe, si on utilise sytématiquement les constructeurs pour créer et les destructeurs pour détruire, y compris en cas d'erreur, il n'y a aucun problème. Il est cependant important de correctement gérer l'état des pointeurs. Si ils sont ou si ils deviennent invalides, les forcer à NULL.
etc etc etc... à chaque erreur eventuelle de construction, je dois détruire les objets précédents, cette répétition de code m'agace, d'où l'idée d'avoir une liste d'objets valides à détruire en cas d'erreur ...
Rien n'empêche de chainer les objets avec leur destructeur. C'est même une idée intéressante...
question bonus les prototypes de mes destructeurs sont tous identiques :
void type_free(type *)
comment déclare -t-on un pointeur de fonction générique sur ce genre de prototype ?
Vour ci-dessus...
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
I once asked an expert COBOL programmer, how to declare local variables in COBOL, the reply was: "what is a local variable?"
nico wrote on 25/06/05 :
Emmanuel Delahaye wrote:
En principe, si on utilise sytématiquement les constructeurs pour créer et
les destructeurs pour détruire, y compris en cas d'erreur, il n'y a aucun
problème. Il est cependant important de correctement gérer l'état des
pointeurs. Si ils sont ou si ils deviennent invalides, les forcer à NULL.
etc etc etc...
à chaque erreur eventuelle de construction, je dois détruire les objets
précédents, cette répétition de code m'agace, d'où l'idée d'avoir une liste
d'objets valides à détruire en cas d'erreur ...
Rien n'empêche de chainer les objets avec leur destructeur. C'est même
une idée intéressante...
En principe, si on utilise sytématiquement les constructeurs pour créer et les destructeurs pour détruire, y compris en cas d'erreur, il n'y a aucun problème. Il est cependant important de correctement gérer l'état des pointeurs. Si ils sont ou si ils deviennent invalides, les forcer à NULL.
etc etc etc... à chaque erreur eventuelle de construction, je dois détruire les objets précédents, cette répétition de code m'agace, d'où l'idée d'avoir une liste d'objets valides à détruire en cas d'erreur ...
Rien n'empêche de chainer les objets avec leur destructeur. C'est même une idée intéressante...
question bonus les prototypes de mes destructeurs sont tous identiques :
void type_free(type *)
comment déclare -t-on un pointeur de fonction générique sur ce genre de prototype ?
Vour ci-dessus...
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
I once asked an expert COBOL programmer, how to declare local variables in COBOL, the reply was: "what is a local variable?"
Richard Delorme
Dans le dernier cas, le problème ne se pose pas vraiment, si ce n'est pour des raisons esthétiques: C'est le système d'exploitation qui va de toute façon libérer tout ce qui a été alloué, en tout cas c'est comme cela que ça fonctionne sur les OS que je connais.
Il me semble que les OS rudimentaires, comme MSDOS, ne libérait rien du tout quand le programme quittait.
-- Richard
Dans le dernier cas, le problème ne se pose pas vraiment, si ce n'est
pour des raisons esthétiques: C'est le système d'exploitation qui va de
toute façon libérer tout ce qui a été alloué, en tout cas c'est comme
cela que ça fonctionne sur les OS que je connais.
Il me semble que les OS rudimentaires, comme MSDOS, ne libérait rien du
tout quand le programme quittait.
Dans le dernier cas, le problème ne se pose pas vraiment, si ce n'est pour des raisons esthétiques: C'est le système d'exploitation qui va de toute façon libérer tout ce qui a été alloué, en tout cas c'est comme cela que ça fonctionne sur les OS que je connais.
Il me semble que les OS rudimentaires, comme MSDOS, ne libérait rien du tout quand le programme quittait.
-- Richard
Charlie Gordon
"Richard Delorme" wrote in message news:42bd7ccb$0$308$
Dans le dernier cas, le problème ne se pose pas vraiment, si ce n'est pour des raisons esthétiques: C'est le système d'exploitation qui va de toute façon libérer tout ce qui a été alloué, en tout cas c'est comme cela que ça fonctionne sur les OS que je connais.
Il me semble que les OS rudimentaires, comme MSDOS, ne libérait rien du tout quand le programme quittait.
Bien sur que si ! D'ailleurs il est très facile pour un OS de taguer les blocs mémoire alloués par un process pour tous les libérer à la fin. En général, ces blocs sont ensuite utilisés par les process pour y implémenter des arènes pour malloc/free. L'overhead n'est donc pas significatif. Dans les OS modernes, c'est au niveau de la mémoire virtuelle que tout ceci est géré.
Chqrlie.
"Richard Delorme" <abulmo@nospam.fr> wrote in message
news:42bd7ccb$0$308$7a628cd7@news.club-internet.fr...
Dans le dernier cas, le problème ne se pose pas vraiment, si ce n'est
pour des raisons esthétiques: C'est le système d'exploitation qui va de
toute façon libérer tout ce qui a été alloué, en tout cas c'est comme
cela que ça fonctionne sur les OS que je connais.
Il me semble que les OS rudimentaires, comme MSDOS, ne libérait rien du
tout quand le programme quittait.
Bien sur que si !
D'ailleurs il est très facile pour un OS de taguer les blocs mémoire alloués par
un process pour tous les libérer à la fin.
En général, ces blocs sont ensuite utilisés par les process pour y implémenter
des arènes pour malloc/free. L'overhead n'est donc pas significatif. Dans les
OS modernes, c'est au niveau de la mémoire virtuelle que tout ceci est géré.
"Richard Delorme" wrote in message news:42bd7ccb$0$308$
Dans le dernier cas, le problème ne se pose pas vraiment, si ce n'est pour des raisons esthétiques: C'est le système d'exploitation qui va de toute façon libérer tout ce qui a été alloué, en tout cas c'est comme cela que ça fonctionne sur les OS que je connais.
Il me semble que les OS rudimentaires, comme MSDOS, ne libérait rien du tout quand le programme quittait.
Bien sur que si ! D'ailleurs il est très facile pour un OS de taguer les blocs mémoire alloués par un process pour tous les libérer à la fin. En général, ces blocs sont ensuite utilisés par les process pour y implémenter des arènes pour malloc/free. L'overhead n'est donc pas significatif. Dans les OS modernes, c'est au niveau de la mémoire virtuelle que tout ceci est géré.
Chqrlie.
Emmanuel Delahaye
Richard Delorme wrote on 25/06/05 :
Dans le dernier cas, le problème ne se pose pas vraiment, si ce n'est pour des raisons esthétiques: C'est le système d'exploitation qui va de toute façon libérer tout ce qui a été alloué, en tout cas c'est comme cela que ça fonctionne sur les OS que je connais.
Il me semble que les OS rudimentaires, comme MSDOS, ne libérait rien du tout quand le programme quittait.
J'ai des cas précis avec BOrland C 3.1. Si on quitte par exit() ou return de main(), c'est OK. Si on quitte par abort() (assert(), par exemple)), rien n'est libéré, et le crash de la machine se produit souvent à la compilation suivante...
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
"There are 10 types of people in the world today; those that understand binary, and those that dont."
Richard Delorme wrote on 25/06/05 :
Dans le dernier cas, le problème ne se pose pas vraiment, si ce n'est
pour des raisons esthétiques: C'est le système d'exploitation qui va de
toute façon libérer tout ce qui a été alloué, en tout cas c'est comme
cela que ça fonctionne sur les OS que je connais.
Il me semble que les OS rudimentaires, comme MSDOS, ne libérait rien du
tout quand le programme quittait.
J'ai des cas précis avec BOrland C 3.1. Si on quitte par exit() ou
return de main(), c'est OK. Si on quitte par abort() (assert(), par
exemple)), rien n'est libéré, et le crash de la machine se produit
souvent à la compilation suivante...
--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html
"There are 10 types of people in the world today;
those that understand binary, and those that dont."
Dans le dernier cas, le problème ne se pose pas vraiment, si ce n'est pour des raisons esthétiques: C'est le système d'exploitation qui va de toute façon libérer tout ce qui a été alloué, en tout cas c'est comme cela que ça fonctionne sur les OS que je connais.
Il me semble que les OS rudimentaires, comme MSDOS, ne libérait rien du tout quand le programme quittait.
J'ai des cas précis avec BOrland C 3.1. Si on quitte par exit() ou return de main(), c'est OK. Si on quitte par abort() (assert(), par exemple)), rien n'est libéré, et le crash de la machine se produit souvent à la compilation suivante...
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
"There are 10 types of people in the world today; those that understand binary, and those that dont."
Charlie Gordon
"Emmanuel Delahaye" wrote in message news:
Richard Delorme wrote on 25/06/05 :
Dans le dernier cas, le problème ne se pose pas vraiment, si ce n'est pour des raisons esthétiques: C'est le système d'exploitation qui va de toute façon libérer tout ce qui a été alloué, en tout cas c'est comme cela que ça fonctionne sur les OS que je connais.
Il me semble que les OS rudimentaires, comme MSDOS, ne libérait rien du tout quand le programme quittait.
J'ai des cas précis avec BOrland C 3.1. Si on quitte par exit() ou return de main(), c'est OK. Si on quitte par abort() (assert(), par exemple)), rien n'est libéré, et le crash de la machine se produit souvent à la compilation suivante...
Vraisemblablement à cause d'une corruption de l'arène système de MS/DOS ou des données de l'OS en général. Je rappelle que sous MS/DOS, il n'y a pas de séparation des process, pas de protection de la mémoire : donc un process peut tout à fait corrompre le système avec un crash pas toujours immédiat.
Il y a plusieurs facons de terminer un process sous MS/DOS : soit en restant résident (int 21/31, int 27), et alors la memoire n'est bien entendu pas libérée, soit normalement : int 20, int 21/00, int 21/4C, ret à l'adresse near 0, jmp à une adresse contenue dans le PSP... toutes font la meme chose : fermer les descripteurs de fichiers ouverts, restaurer certains vecteurs d'interruption, et desallouer toute la memoire associée au process, y compris le PSP lui-meme.
Tout ceci est OT, et de plus totalement obsolète.
Chqrlie.
"Emmanuel Delahaye" <emdel@YOURBRAnoos.fr> wrote in message
news:mn.cd437d56a968d1d8.15512@YOURBRAnoos.fr...
Richard Delorme wrote on 25/06/05 :
Dans le dernier cas, le problème ne se pose pas vraiment, si ce n'est
pour des raisons esthétiques: C'est le système d'exploitation qui va de
toute façon libérer tout ce qui a été alloué, en tout cas c'est comme
cela que ça fonctionne sur les OS que je connais.
Il me semble que les OS rudimentaires, comme MSDOS, ne libérait rien du
tout quand le programme quittait.
J'ai des cas précis avec BOrland C 3.1. Si on quitte par exit() ou
return de main(), c'est OK. Si on quitte par abort() (assert(), par
exemple)), rien n'est libéré, et le crash de la machine se produit
souvent à la compilation suivante...
Vraisemblablement à cause d'une corruption de l'arène système de MS/DOS ou des
données de l'OS en général.
Je rappelle que sous MS/DOS, il n'y a pas de séparation des process, pas de
protection de la mémoire : donc un process peut tout à fait corrompre le système
avec un crash pas toujours immédiat.
Il y a plusieurs facons de terminer un process sous MS/DOS : soit en restant
résident (int 21/31, int 27), et alors la memoire n'est bien entendu pas
libérée, soit normalement : int 20, int 21/00, int 21/4C, ret à l'adresse near
0, jmp à une adresse contenue dans le PSP... toutes font la meme chose : fermer
les descripteurs de fichiers ouverts, restaurer certains vecteurs
d'interruption, et desallouer toute la memoire associée au process, y compris le
PSP lui-meme.
Dans le dernier cas, le problème ne se pose pas vraiment, si ce n'est pour des raisons esthétiques: C'est le système d'exploitation qui va de toute façon libérer tout ce qui a été alloué, en tout cas c'est comme cela que ça fonctionne sur les OS que je connais.
Il me semble que les OS rudimentaires, comme MSDOS, ne libérait rien du tout quand le programme quittait.
J'ai des cas précis avec BOrland C 3.1. Si on quitte par exit() ou return de main(), c'est OK. Si on quitte par abort() (assert(), par exemple)), rien n'est libéré, et le crash de la machine se produit souvent à la compilation suivante...
Vraisemblablement à cause d'une corruption de l'arène système de MS/DOS ou des données de l'OS en général. Je rappelle que sous MS/DOS, il n'y a pas de séparation des process, pas de protection de la mémoire : donc un process peut tout à fait corrompre le système avec un crash pas toujours immédiat.
Il y a plusieurs facons de terminer un process sous MS/DOS : soit en restant résident (int 21/31, int 27), et alors la memoire n'est bien entendu pas libérée, soit normalement : int 20, int 21/00, int 21/4C, ret à l'adresse near 0, jmp à une adresse contenue dans le PSP... toutes font la meme chose : fermer les descripteurs de fichiers ouverts, restaurer certains vecteurs d'interruption, et desallouer toute la memoire associée au process, y compris le PSP lui-meme.
Tout ceci est OT, et de plus totalement obsolète.
Chqrlie.
Emmanuel Delahaye
Charlie Gordon wrote on 26/06/05 :
Tout ceci est OT, et de plus totalement obsolète.
Bof, je me sers de Borland C3.1 tous les jours pour écrire et tester mon code...
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
"Mal nommer les choses c'est ajouter du malheur au monde." -- Albert Camus.
Charlie Gordon wrote on 26/06/05 :
Tout ceci est OT, et de plus totalement obsolète.
Bof, je me sers de Borland C3.1 tous les jours pour écrire et tester
mon code...
--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html
"Mal nommer les choses c'est ajouter du malheur au
monde." -- Albert Camus.
Bof, je me sers de Borland C3.1 tous les jours pour écrire et tester mon code...
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
"Mal nommer les choses c'est ajouter du malheur au monde." -- Albert Camus.
espie
Il existe des implementations de C parfaitement conformes a la norme, ou la memoire non liberee par free n'est pas rendue au systeme en fin d'execution du programme.
Plus precisement, confere 5.1.2.1, Freestanding environment.
Et non, ce n'est pas une simple boutade. Omettre les free correspondant aux allocations dynamiques limite la portabilite d'un programme. Il existe en pratique quantite d'implementations freestanding, avec des extensions de la bibliotheque qui sont tres proches d'un environnement hosted, a ces quelques details de gestion des ressources pres...
Il existe des implementations de C parfaitement conformes a la norme,
ou la memoire non liberee par free n'est pas rendue au systeme en
fin d'execution du programme.
Plus precisement, confere 5.1.2.1, Freestanding environment.
Et non, ce n'est pas une simple boutade. Omettre les free
correspondant aux allocations dynamiques limite la portabilite
d'un programme. Il existe en pratique quantite d'implementations
freestanding, avec des extensions de la bibliotheque qui sont tres
proches d'un environnement hosted, a ces quelques details de gestion
des ressources pres...
Il existe des implementations de C parfaitement conformes a la norme, ou la memoire non liberee par free n'est pas rendue au systeme en fin d'execution du programme.
Plus precisement, confere 5.1.2.1, Freestanding environment.
Et non, ce n'est pas une simple boutade. Omettre les free correspondant aux allocations dynamiques limite la portabilite d'un programme. Il existe en pratique quantite d'implementations freestanding, avec des extensions de la bibliotheque qui sont tres proches d'un environnement hosted, a ces quelques details de gestion des ressources pres...
Emmanuel Delahaye
Marc Espie wrote on 26/06/05 :
Il existe des implementations de C parfaitement conformes a la norme, ou la memoire non liberee par free n'est pas rendue au systeme en fin d'execution du programme.
Plus precisement, confere 5.1.2.1, Freestanding environment.
Et non, ce n'est pas une simple boutade. Omettre les free correspondant aux allocations dynamiques limite la portabilite d'un programme. Il existe en pratique quantite d'implementations freestanding, avec des extensions de la bibliotheque qui sont tres proches d'un environnement hosted, a ces quelques details de gestion des ressources pres...
Avec Linux Embarqué, la frontière entre hosted et freestanding est ténue...
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
"There are 10 types of people in the world today; those that understand binary, and those that dont."
Marc Espie wrote on 26/06/05 :
Il existe des implementations de C parfaitement conformes a la norme,
ou la memoire non liberee par free n'est pas rendue au systeme en
fin d'execution du programme.
Plus precisement, confere 5.1.2.1, Freestanding environment.
Et non, ce n'est pas une simple boutade. Omettre les free
correspondant aux allocations dynamiques limite la portabilite
d'un programme. Il existe en pratique quantite d'implementations
freestanding, avec des extensions de la bibliotheque qui sont tres
proches d'un environnement hosted, a ces quelques details de gestion
des ressources pres...
Avec Linux Embarqué, la frontière entre hosted et freestanding est
ténue...
--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html
"There are 10 types of people in the world today;
those that understand binary, and those that dont."
Il existe des implementations de C parfaitement conformes a la norme, ou la memoire non liberee par free n'est pas rendue au systeme en fin d'execution du programme.
Plus precisement, confere 5.1.2.1, Freestanding environment.
Et non, ce n'est pas une simple boutade. Omettre les free correspondant aux allocations dynamiques limite la portabilite d'un programme. Il existe en pratique quantite d'implementations freestanding, avec des extensions de la bibliotheque qui sont tres proches d'un environnement hosted, a ces quelques details de gestion des ressources pres...
Avec Linux Embarqué, la frontière entre hosted et freestanding est ténue...
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
"There are 10 types of people in the world today; those that understand binary, and those that dont."
Gabriel Dos Reis
"Emmanuel Delahaye" writes:
| Marc Espie wrote on 26/06/05 : | > Il existe des implementations de C parfaitement conformes a la norme, | > ou la memoire non liberee par free n'est pas rendue au systeme en | > fin d'execution du programme. | > | > Plus precisement, confere 5.1.2.1, Freestanding environment. | > | > Et non, ce n'est pas une simple boutade. Omettre les free | > correspondant aux allocations dynamiques limite la portabilite | > d'un programme. Il existe en pratique quantite d'implementations | > freestanding, avec des extensions de la bibliotheque qui sont tres | > proches d'un environnement hosted, a ces quelques details de gestion | > des ressources pres... | | Avec Linux Embarqué, la frontière entre hosted et freestanding est | ténue...
mais le monde des systèmes embarqués ne tourne pas autour de embedded linux.
| Marc Espie wrote on 26/06/05 :
| > Il existe des implementations de C parfaitement conformes a la norme,
| > ou la memoire non liberee par free n'est pas rendue au systeme en
| > fin d'execution du programme.
| >
| > Plus precisement, confere 5.1.2.1, Freestanding environment.
| >
| > Et non, ce n'est pas une simple boutade. Omettre les free
| > correspondant aux allocations dynamiques limite la portabilite
| > d'un programme. Il existe en pratique quantite d'implementations
| > freestanding, avec des extensions de la bibliotheque qui sont tres
| > proches d'un environnement hosted, a ces quelques details de gestion
| > des ressources pres...
|
| Avec Linux Embarqué, la frontière entre hosted et freestanding est
| ténue...
mais le monde des systèmes embarqués ne tourne pas autour de embedded
linux.
| Marc Espie wrote on 26/06/05 : | > Il existe des implementations de C parfaitement conformes a la norme, | > ou la memoire non liberee par free n'est pas rendue au systeme en | > fin d'execution du programme. | > | > Plus precisement, confere 5.1.2.1, Freestanding environment. | > | > Et non, ce n'est pas une simple boutade. Omettre les free | > correspondant aux allocations dynamiques limite la portabilite | > d'un programme. Il existe en pratique quantite d'implementations | > freestanding, avec des extensions de la bibliotheque qui sont tres | > proches d'un environnement hosted, a ces quelques details de gestion | > des ressources pres... | | Avec Linux Embarqué, la frontière entre hosted et freestanding est | ténue...
mais le monde des systèmes embarqués ne tourne pas autour de embedded linux.
-- Gaby
espie
In article , Gabriel Dos Reis wrote:
"Emmanuel Delahaye" writes: | Avec Linux Embarqué, la frontière entre hosted et freestanding est | ténue...
mais le monde des systèmes embarqués ne tourne pas autour de embedded linux.
Je pense qu'Emmanuel desirais juste citer un exemple repandu parmi d'autres...
In article <m3wtohayj3.fsf@uniton.integrable-solutions.net>,
Gabriel Dos Reis <gdr@integrable-solutions.net> wrote:
"Emmanuel Delahaye" <emdel@YOURBRAnoos.fr> writes:
| Avec Linux Embarqué, la frontière entre hosted et freestanding est
| ténue...
mais le monde des systèmes embarqués ne tourne pas autour de embedded
linux.
Je pense qu'Emmanuel desirais juste citer un exemple repandu parmi
d'autres...