Ce n'est pas bien méchant.
En revanche, après le retour de "delete *this", le pointeur "this"
n'est plus valide. Tu ne dois donc plus l'utiliser, explicitement ou
implicitement (en faisant référence à un membre de la classe). Mais à
part ça, tu peux faire tout ce qui te plaît.
Ce n'est pas bien méchant.
En revanche, après le retour de "delete *this", le pointeur "this"
n'est plus valide. Tu ne dois donc plus l'utiliser, explicitement ou
implicitement (en faisant référence à un membre de la classe). Mais à
part ça, tu peux faire tout ce qui te plaît.
Ce n'est pas bien méchant.
En revanche, après le retour de "delete *this", le pointeur "this"
n'est plus valide. Tu ne dois donc plus l'utiliser, explicitement ou
implicitement (en faisant référence à un membre de la classe). Mais à
part ça, tu peux faire tout ce qui te plaît.
Je sais bien, mais ça me pose un problème métaphysique (ou moral).
C'est comme les parenthèses derrière un return ;)
Je sais bien, mais ça me pose un problème métaphysique (ou moral).
C'est comme les parenthèses derrière un return ;)
Je sais bien, mais ça me pose un problème métaphysique (ou moral).
C'est comme les parenthèses derrière un return ;)
On 17 fév, 09:02, requinham wrote:On 17 fév, 09:03, Mickaël Wolff wrote:requinham a écrit :en fait est ce que c'est nécessaire de la déclarer static au
niveau conceptuel.Oui, sinon on risque de se poser des questions sur le pourquoi de
ce fonctionnement.
A vrai dire, le fait de la déclarer static n'a pas de sens car
pouvoir fair un appel statique à destroy n'aura pas de sens tant
qu'il n'y a pas de singleton en memoire et dans le cas où il y en
a on peut l'appeler à partir du singleton exple :
A::getInstance()->destroy() sans problème vue que c'est la
derniere instruction appelé dans la vie du singleton.
Ta question laisse supposer que tu vas appeler toi même la fonction
de destruction du singleton.
AMHA il vaut mieux un traitement générique de la durée de vie du
singleton C'est à dire qu'un singleton hérite d'une interface avec
une fonction membre virtual void destroy(); et qu'une fonction de
netoyage soit en charge de l'appeler au moment de la fin de vie.
Cette solution de permet de distinguer les types de singleton et
leur durée de vie associée à un évènement:
- détruit par le système (pas enregistré auprès d'un gestionnaire
de singleton)
- détruit explicitment à l'exit ou en sortie de scope
- détruit à la sortie d'un thread (pour les singletons TSS)
- détruit quand une dll est déchargée
- ...
Déjà, une fonction de destruction en sortie de programme ( avec
at_exit() ) devrait couvrir la plupart des cas courants et t'évitera
d'avoir à te creuser la tête pour svaoir quand appeler destroy().
Le mieux reste quand même de laisser le système réclamer les
ressources - si c'est possible.
On 17 fév, 09:02, requinham <requin...@gmail.com> wrote:
On 17 fév, 09:03, Mickaël Wolff <mickael.wo...@laposte.net> wrote:
requinham a écrit :
en fait est ce que c'est nécessaire de la déclarer static au
niveau conceptuel.
Oui, sinon on risque de se poser des questions sur le pourquoi de
ce fonctionnement.
A vrai dire, le fait de la déclarer static n'a pas de sens car
pouvoir fair un appel statique à destroy n'aura pas de sens tant
qu'il n'y a pas de singleton en memoire et dans le cas où il y en
a on peut l'appeler à partir du singleton exple :
A::getInstance()->destroy() sans problème vue que c'est la
derniere instruction appelé dans la vie du singleton.
Ta question laisse supposer que tu vas appeler toi même la fonction
de destruction du singleton.
AMHA il vaut mieux un traitement générique de la durée de vie du
singleton C'est à dire qu'un singleton hérite d'une interface avec
une fonction membre virtual void destroy(); et qu'une fonction de
netoyage soit en charge de l'appeler au moment de la fin de vie.
Cette solution de permet de distinguer les types de singleton et
leur durée de vie associée à un évènement:
- détruit par le système (pas enregistré auprès d'un gestionnaire
de singleton)
- détruit explicitment à l'exit ou en sortie de scope
- détruit à la sortie d'un thread (pour les singletons TSS)
- détruit quand une dll est déchargée
- ...
Déjà, une fonction de destruction en sortie de programme ( avec
at_exit() ) devrait couvrir la plupart des cas courants et t'évitera
d'avoir à te creuser la tête pour svaoir quand appeler destroy().
Le mieux reste quand même de laisser le système réclamer les
ressources - si c'est possible.
On 17 fév, 09:02, requinham wrote:On 17 fév, 09:03, Mickaël Wolff wrote:requinham a écrit :en fait est ce que c'est nécessaire de la déclarer static au
niveau conceptuel.Oui, sinon on risque de se poser des questions sur le pourquoi de
ce fonctionnement.
A vrai dire, le fait de la déclarer static n'a pas de sens car
pouvoir fair un appel statique à destroy n'aura pas de sens tant
qu'il n'y a pas de singleton en memoire et dans le cas où il y en
a on peut l'appeler à partir du singleton exple :
A::getInstance()->destroy() sans problème vue que c'est la
derniere instruction appelé dans la vie du singleton.
Ta question laisse supposer que tu vas appeler toi même la fonction
de destruction du singleton.
AMHA il vaut mieux un traitement générique de la durée de vie du
singleton C'est à dire qu'un singleton hérite d'une interface avec
une fonction membre virtual void destroy(); et qu'une fonction de
netoyage soit en charge de l'appeler au moment de la fin de vie.
Cette solution de permet de distinguer les types de singleton et
leur durée de vie associée à un évènement:
- détruit par le système (pas enregistré auprès d'un gestionnaire
de singleton)
- détruit explicitment à l'exit ou en sortie de scope
- détruit à la sortie d'un thread (pour les singletons TSS)
- détruit quand une dll est déchargée
- ...
Déjà, une fonction de destruction en sortie de programme ( avec
at_exit() ) devrait couvrir la plupart des cas courants et t'évitera
d'avoir à te creuser la tête pour svaoir quand appeler destroy().
Le mieux reste quand même de laisser le système réclamer les
ressources - si c'est possible.
Bonsoir.
"Michael Doubez" a écrit dans le message
de news
> On 17 fév, 09:02, requinham wrote:
>> On 17 fév, 09:03, Mickaël Wolff wrote:
> Cette solution de permet de distinguer les types de singleton et
> leur durée de vie associée à un évènement:
> - détruit par le système (pas enregistré auprès d'un gestionn aire
> de singleton)
> - détruit explicitment à l'exit ou en sortie de scope
> - détruit à la sortie d'un thread (pour les singletons TSS)
> - détruit quand une dll est déchargée
> - ...
> Déjà, une fonction de destruction en sortie de programme ( avec
> at_exit() ) devrait couvrir la plupart des cas courants et t'évitera
> d'avoir à te creuser la tête pour svaoir quand appeler destroy().
> Le mieux reste quand même de laisser le système réclamer les
> ressources - si c'est possible.
Cette discussion me rappelle celle-ci, qui faisait intervenir
un problème parasite et très génant: l'ordre d'assemblage des
modules objets par le linker:http://tinyurl.com/yjng66e
(alias
pour)http://groups.google.com/group/fr.comp.lang.c++/browse_thread/thread /...
1453053d2/42e34475bd490e9d
...avec finalement impossibilité de compter même sur atexit().
Quand à renoncer à restituer les ressources pour laisser le
système les reprendre, au-delà du côté frustrant, je ne suis
pas sûr que le système puisse tout "fermer" proprement. Ca
dépend de la nature des ressources, en y incluant le
fonctionnel que l'on implémente:
Il va reprendre la mémoire, déclarer abandonnés les mutexes et
autres objets system-wide,
...fermer les fichiers ouverts (mais sans flush a priori),
...mais il peut y avoir d'autres éléments fonctionnels codés
dans les destructeurs des objets représentant l'application,
et qui ne seront pas traités (par exemple: écrire un épilogue
dans un fichier avant de le fermer, envoyer une trame "bye"
dans une connexion, écrire un log, etc.)
Bref, je persiste à penser qu'un last-event exploitable dans
le processus fait cruellement défaut.
Bonsoir.
"Michael Doubez" <michael.dou...@free.fr> a écrit dans le message
de news 9b647606-0e73-411a-9d2a-d18b5703d...@o3g2000yqb.googlegroups.com
> On 17 fév, 09:02, requinham <requin...@gmail.com> wrote:
>> On 17 fév, 09:03, Mickaël Wolff <mickael.wo...@laposte.net> wrote:
> Cette solution de permet de distinguer les types de singleton et
> leur durée de vie associée à un évènement:
> - détruit par le système (pas enregistré auprès d'un gestionn aire
> de singleton)
> - détruit explicitment à l'exit ou en sortie de scope
> - détruit à la sortie d'un thread (pour les singletons TSS)
> - détruit quand une dll est déchargée
> - ...
> Déjà, une fonction de destruction en sortie de programme ( avec
> at_exit() ) devrait couvrir la plupart des cas courants et t'évitera
> d'avoir à te creuser la tête pour svaoir quand appeler destroy().
> Le mieux reste quand même de laisser le système réclamer les
> ressources - si c'est possible.
Cette discussion me rappelle celle-ci, qui faisait intervenir
un problème parasite et très génant: l'ordre d'assemblage des
modules objets par le linker:http://tinyurl.com/yjng66e
(alias
pour)http://groups.google.com/group/fr.comp.lang.c++/browse_thread/thread /...
1453053d2/42e34475bd490e9d
...avec finalement impossibilité de compter même sur atexit().
Quand à renoncer à restituer les ressources pour laisser le
système les reprendre, au-delà du côté frustrant, je ne suis
pas sûr que le système puisse tout "fermer" proprement. Ca
dépend de la nature des ressources, en y incluant le
fonctionnel que l'on implémente:
Il va reprendre la mémoire, déclarer abandonnés les mutexes et
autres objets system-wide,
...fermer les fichiers ouverts (mais sans flush a priori),
...mais il peut y avoir d'autres éléments fonctionnels codés
dans les destructeurs des objets représentant l'application,
et qui ne seront pas traités (par exemple: écrire un épilogue
dans un fichier avant de le fermer, envoyer une trame "bye"
dans une connexion, écrire un log, etc.)
Bref, je persiste à penser qu'un last-event exploitable dans
le processus fait cruellement défaut.
Bonsoir.
"Michael Doubez" a écrit dans le message
de news
> On 17 fév, 09:02, requinham wrote:
>> On 17 fév, 09:03, Mickaël Wolff wrote:
> Cette solution de permet de distinguer les types de singleton et
> leur durée de vie associée à un évènement:
> - détruit par le système (pas enregistré auprès d'un gestionn aire
> de singleton)
> - détruit explicitment à l'exit ou en sortie de scope
> - détruit à la sortie d'un thread (pour les singletons TSS)
> - détruit quand une dll est déchargée
> - ...
> Déjà, une fonction de destruction en sortie de programme ( avec
> at_exit() ) devrait couvrir la plupart des cas courants et t'évitera
> d'avoir à te creuser la tête pour svaoir quand appeler destroy().
> Le mieux reste quand même de laisser le système réclamer les
> ressources - si c'est possible.
Cette discussion me rappelle celle-ci, qui faisait intervenir
un problème parasite et très génant: l'ordre d'assemblage des
modules objets par le linker:http://tinyurl.com/yjng66e
(alias
pour)http://groups.google.com/group/fr.comp.lang.c++/browse_thread/thread /...
1453053d2/42e34475bd490e9d
...avec finalement impossibilité de compter même sur atexit().
Quand à renoncer à restituer les ressources pour laisser le
système les reprendre, au-delà du côté frustrant, je ne suis
pas sûr que le système puisse tout "fermer" proprement. Ca
dépend de la nature des ressources, en y incluant le
fonctionnel que l'on implémente:
Il va reprendre la mémoire, déclarer abandonnés les mutexes et
autres objets system-wide,
...fermer les fichiers ouverts (mais sans flush a priori),
...mais il peut y avoir d'autres éléments fonctionnels codés
dans les destructeurs des objets représentant l'application,
et qui ne seront pas traités (par exemple: écrire un épilogue
dans un fichier avant de le fermer, envoyer une trame "bye"
dans une connexion, écrire un log, etc.)
Bref, je persiste à penser qu'un last-event exploitable dans
le processus fait cruellement défaut.
On 22 Feb, 23:24, "Patrick 'Zener' Brunet"
wrote:Bonsoir.
"Michael Doubez" a écrit dans le message
de newsOn 17 fév, 09:02, requinham wrote:On 17 fév, 09:03, Mickaël Wolff
wrote:
[...]Cette solution de permet de distinguer les types de singleton et
leur durée de vie associée à un évènement:
- détruit par le système (pas enregistré auprès d'un
gestionnaire de singleton)
- détruit explicitment à l'exit ou en sortie de scope
- détruit à la sortie d'un thread (pour les singletons TSS)
- détruit quand une dll est déchargée
- ...Déjà, une fonction de destruction en sortie de programme ( avec
at_exit() ) devrait couvrir la plupart des cas courants et
t'évitera d'avoir à te creuser la tête pour svaoir quand appeler
destroy().Le mieux reste quand même de laisser le système réclamer les
ressources - si c'est possible.Cette discussion me rappelle celle-ci, qui faisait intervenir
un problème parasite et très génant: l'ordre d'assemblage des
modules objets par le linker:
> http://tinyurl.com/yjng66e(alias
1453053d2/42e34475bd490e9d...avec finalement impossibilité de compter même sur atexit().Quand à renoncer à restituer les ressources pour laisser le
système les reprendre, au-delà du côté frustrant, je ne suis
pas sûr que le système puisse tout "fermer" proprement. Ca
dépend de la nature des ressources, en y incluant le
fonctionnel que l'on implémente:
Il va reprendre la mémoire, déclarer abandonnés les mutexes et
autres objets system-wide,
...fermer les fichiers ouverts (mais sans flush a priori),
...mais il peut y avoir d'autres éléments fonctionnels codés
dans les destructeurs des objets représentant l'application,
et qui ne seront pas traités (par exemple: écrire un épilogue
dans un fichier avant de le fermer, envoyer une trame "bye"
dans une connexion, écrire un log, etc.)Bref, je persiste à penser qu'un last-event exploitable dans
le processus fait cruellement défaut.
Le problème, c'est qu'il n'y a pas de solution possible du
problème. Que faire, par exemple, si écrire l'épilogue a besoin
d'autres ressources qui pourraient déjà avoir été libérées ? Il
peut y avoir des dépendences que ni le système ni le compilateur
ne peuvent savoir.
On 22 Feb, 23:24, "Patrick 'Zener' Brunet"
<use.link.in.signat...@ddress.invalid> wrote:
Bonsoir.
"Michael Doubez" <michael.dou...@free.fr> a écrit dans le message
de news
9b647606-0e73-411a-9d2a-d18b5703d...@o3g2000yqb.googlegroups.com
On 17 fév, 09:02, requinham <requin...@gmail.com> wrote:
On 17 fév, 09:03, Mickaël Wolff <mickael.wo...@laposte.net>
wrote:
[...]
Cette solution de permet de distinguer les types de singleton et
leur durée de vie associée à un évènement:
- détruit par le système (pas enregistré auprès d'un
gestionnaire de singleton)
- détruit explicitment à l'exit ou en sortie de scope
- détruit à la sortie d'un thread (pour les singletons TSS)
- détruit quand une dll est déchargée
- ...
Déjà, une fonction de destruction en sortie de programme ( avec
at_exit() ) devrait couvrir la plupart des cas courants et
t'évitera d'avoir à te creuser la tête pour svaoir quand appeler
destroy().
Le mieux reste quand même de laisser le système réclamer les
ressources - si c'est possible.
Cette discussion me rappelle celle-ci, qui faisait intervenir
un problème parasite et très génant: l'ordre d'assemblage des
modules objets par le linker:
> http://tinyurl.com/yjng66e
(alias
1453053d2/42e34475bd490e9d
...avec finalement impossibilité de compter même sur atexit().
Quand à renoncer à restituer les ressources pour laisser le
système les reprendre, au-delà du côté frustrant, je ne suis
pas sûr que le système puisse tout "fermer" proprement. Ca
dépend de la nature des ressources, en y incluant le
fonctionnel que l'on implémente:
Il va reprendre la mémoire, déclarer abandonnés les mutexes et
autres objets system-wide,
...fermer les fichiers ouverts (mais sans flush a priori),
...mais il peut y avoir d'autres éléments fonctionnels codés
dans les destructeurs des objets représentant l'application,
et qui ne seront pas traités (par exemple: écrire un épilogue
dans un fichier avant de le fermer, envoyer une trame "bye"
dans une connexion, écrire un log, etc.)
Bref, je persiste à penser qu'un last-event exploitable dans
le processus fait cruellement défaut.
Le problème, c'est qu'il n'y a pas de solution possible du
problème. Que faire, par exemple, si écrire l'épilogue a besoin
d'autres ressources qui pourraient déjà avoir été libérées ? Il
peut y avoir des dépendences que ni le système ni le compilateur
ne peuvent savoir.
On 22 Feb, 23:24, "Patrick 'Zener' Brunet"
wrote:Bonsoir.
"Michael Doubez" a écrit dans le message
de newsOn 17 fév, 09:02, requinham wrote:On 17 fév, 09:03, Mickaël Wolff
wrote:
[...]Cette solution de permet de distinguer les types de singleton et
leur durée de vie associée à un évènement:
- détruit par le système (pas enregistré auprès d'un
gestionnaire de singleton)
- détruit explicitment à l'exit ou en sortie de scope
- détruit à la sortie d'un thread (pour les singletons TSS)
- détruit quand une dll est déchargée
- ...Déjà, une fonction de destruction en sortie de programme ( avec
at_exit() ) devrait couvrir la plupart des cas courants et
t'évitera d'avoir à te creuser la tête pour svaoir quand appeler
destroy().Le mieux reste quand même de laisser le système réclamer les
ressources - si c'est possible.Cette discussion me rappelle celle-ci, qui faisait intervenir
un problème parasite et très génant: l'ordre d'assemblage des
modules objets par le linker:
> http://tinyurl.com/yjng66e(alias
1453053d2/42e34475bd490e9d...avec finalement impossibilité de compter même sur atexit().Quand à renoncer à restituer les ressources pour laisser le
système les reprendre, au-delà du côté frustrant, je ne suis
pas sûr que le système puisse tout "fermer" proprement. Ca
dépend de la nature des ressources, en y incluant le
fonctionnel que l'on implémente:
Il va reprendre la mémoire, déclarer abandonnés les mutexes et
autres objets system-wide,
...fermer les fichiers ouverts (mais sans flush a priori),
...mais il peut y avoir d'autres éléments fonctionnels codés
dans les destructeurs des objets représentant l'application,
et qui ne seront pas traités (par exemple: écrire un épilogue
dans un fichier avant de le fermer, envoyer une trame "bye"
dans une connexion, écrire un log, etc.)Bref, je persiste à penser qu'un last-event exploitable dans
le processus fait cruellement défaut.
Le problème, c'est qu'il n'y a pas de solution possible du
problème. Que faire, par exemple, si écrire l'épilogue a besoin
d'autres ressources qui pourraient déjà avoir été libérées ? Il
peut y avoir des dépendences que ni le système ni le compilateur
ne peuvent savoir.
"James Kanze" a écrit dans le message
de news m
> On 22 Feb, 23:24, "Patrick 'Zener' Brunet"
> wrote:
>> Bonsoir.
>> "Michael Doubez" a écrit dans le message
>> de news
>>
>>> On 17 fév, 09:02, requinham wrote:
>>>> On 17 fév, 09:03, Mickaël Wolff
>>>> wrote:
> [...]
>>> Cette solution de permet de distinguer les types de singleton et
>>> leur durée de vie associée à un évènement:
>>> - détruit par le système (pas enregistré auprès d'un
>>> gestionnaire de singleton)
>>> - détruit explicitment à l'exit ou en sortie de scope
>>> - détruit à la sortie d'un thread (pour les singletons TSS)
>>> - détruit quand une dll est déchargée
>>> - ...
>>> Déjà, une fonction de destruction en sortie de programme ( avec
>>> at_exit() ) devrait couvrir la plupart des cas courants et
>>> t'évitera d'avoir à te creuser la tête pour svaoir quand appele r
>>> destroy().
>>> Le mieux reste quand même de laisser le système réclamer les
>>> ressources - si c'est possible.
>> Cette discussion me rappelle celle-ci, qui faisait intervenir
>> un problème parasite et très génant: l'ordre d'assemblage des
>> modules objets par le linker:
> >http://tinyurl.com/yjng66e
>> (alias
pour)http://groups.google.com/group/fr.comp.lang.c++/browse_thread/thread /..
.
>> 1453053d2/42e34475bd490e9d
>> ...avec finalement impossibilité de compter même sur atexit().
>> Quand à renoncer à restituer les ressources pour laisser le
>> système les reprendre, au-delà du côté frustrant, je ne suis
>> pas sûr que le système puisse tout "fermer" proprement. Ca
>> dépend de la nature des ressources, en y incluant le
>> fonctionnel que l'on implémente:
>> Il va reprendre la mémoire, déclarer abandonnés les mutexes et
>> autres objets system-wide,
>> ...fermer les fichiers ouverts (mais sans flush a priori),
>> ...mais il peut y avoir d'autres éléments fonctionnels codés
>> dans les destructeurs des objets représentant l'application,
>> et qui ne seront pas traités (par exemple: écrire un épilogue
>> dans un fichier avant de le fermer, envoyer une trame "bye"
>> dans une connexion, écrire un log, etc.)
>> Bref, je persiste à penser qu'un last-event exploitable dans
>> le processus fait cruellement défaut.
> Le problème, c'est qu'il n'y a pas de solution possible du
> problème. Que faire, par exemple, si écrire l'épilogue a besoin
> d'autres ressources qui pourraient déjà avoir été libérées ? Il
> peut y avoir des dépendences que ni le système ni le compilateur
> ne peuvent savoir.
Certes! Ca va être un peu long, mais j'aime la précision.
Moi ce que je voudrais, c'est avoir une chance de dépiler
proprement ce que *moi* j'ai pu construire dans l'ordre
inverse.
Je pense en effet qu'il est malsain de compter sur le système
et le compilo pour deviner, et donc que le développeur doit
aller jusqu'au bout de ce qu'il implémente et dont il maîtrise
la logique. Avec un déclencheur adéquat, on pourrait le
faire.
Par exemple, si je disposais d'une callback genre atexit() et
de la garantie qu'elle est invoquée juste avant l'exit du
process, c'est à dire *après le dernier destructeur d'objet
global*, incluant ceux de l'utilisateur, je pourrais m'en
servir.
J'ai beau chercher, je ne vois pas de bonne raison (au sens fonctionnel)
pour qu'une callback de atexit() puisse être intercalée entre les
destructeurs d'objets globaux dans le démontage final.
"James Kanze" <james.ka...@gmail.com> a écrit dans le message
de news 2c6e86ad-d834-4e56-aef3-be8fc1865...@y11g2000yqh.googlegroups.co m
> On 22 Feb, 23:24, "Patrick 'Zener' Brunet"
> <use.link.in.signat...@ddress.invalid> wrote:
>> Bonsoir.
>> "Michael Doubez" <michael.dou...@free.fr> a écrit dans le message
>> de news
>> 9b647606-0e73-411a-9d2a-d18b5703d...@o3g2000yqb.googlegroups.com
>>> On 17 fév, 09:02, requinham <requin...@gmail.com> wrote:
>>>> On 17 fév, 09:03, Mickaël Wolff <mickael.wo...@laposte.net>
>>>> wrote:
> [...]
>>> Cette solution de permet de distinguer les types de singleton et
>>> leur durée de vie associée à un évènement:
>>> - détruit par le système (pas enregistré auprès d'un
>>> gestionnaire de singleton)
>>> - détruit explicitment à l'exit ou en sortie de scope
>>> - détruit à la sortie d'un thread (pour les singletons TSS)
>>> - détruit quand une dll est déchargée
>>> - ...
>>> Déjà, une fonction de destruction en sortie de programme ( avec
>>> at_exit() ) devrait couvrir la plupart des cas courants et
>>> t'évitera d'avoir à te creuser la tête pour svaoir quand appele r
>>> destroy().
>>> Le mieux reste quand même de laisser le système réclamer les
>>> ressources - si c'est possible.
>> Cette discussion me rappelle celle-ci, qui faisait intervenir
>> un problème parasite et très génant: l'ordre d'assemblage des
>> modules objets par le linker:
> >http://tinyurl.com/yjng66e
>> (alias
pour)http://groups.google.com/group/fr.comp.lang.c++/browse_thread/thread /..
.
>> 1453053d2/42e34475bd490e9d
>> ...avec finalement impossibilité de compter même sur atexit().
>> Quand à renoncer à restituer les ressources pour laisser le
>> système les reprendre, au-delà du côté frustrant, je ne suis
>> pas sûr que le système puisse tout "fermer" proprement. Ca
>> dépend de la nature des ressources, en y incluant le
>> fonctionnel que l'on implémente:
>> Il va reprendre la mémoire, déclarer abandonnés les mutexes et
>> autres objets system-wide,
>> ...fermer les fichiers ouverts (mais sans flush a priori),
>> ...mais il peut y avoir d'autres éléments fonctionnels codés
>> dans les destructeurs des objets représentant l'application,
>> et qui ne seront pas traités (par exemple: écrire un épilogue
>> dans un fichier avant de le fermer, envoyer une trame "bye"
>> dans une connexion, écrire un log, etc.)
>> Bref, je persiste à penser qu'un last-event exploitable dans
>> le processus fait cruellement défaut.
> Le problème, c'est qu'il n'y a pas de solution possible du
> problème. Que faire, par exemple, si écrire l'épilogue a besoin
> d'autres ressources qui pourraient déjà avoir été libérées ? Il
> peut y avoir des dépendences que ni le système ni le compilateur
> ne peuvent savoir.
Certes! Ca va être un peu long, mais j'aime la précision.
Moi ce que je voudrais, c'est avoir une chance de dépiler
proprement ce que *moi* j'ai pu construire dans l'ordre
inverse.
Je pense en effet qu'il est malsain de compter sur le système
et le compilo pour deviner, et donc que le développeur doit
aller jusqu'au bout de ce qu'il implémente et dont il maîtrise
la logique. Avec un déclencheur adéquat, on pourrait le
faire.
Par exemple, si je disposais d'une callback genre atexit() et
de la garantie qu'elle est invoquée juste avant l'exit du
process, c'est à dire *après le dernier destructeur d'objet
global*, incluant ceux de l'utilisateur, je pourrais m'en
servir.
J'ai beau chercher, je ne vois pas de bonne raison (au sens fonctionnel)
pour qu'une callback de atexit() puisse être intercalée entre les
destructeurs d'objets globaux dans le démontage final.
"James Kanze" a écrit dans le message
de news m
> On 22 Feb, 23:24, "Patrick 'Zener' Brunet"
> wrote:
>> Bonsoir.
>> "Michael Doubez" a écrit dans le message
>> de news
>>
>>> On 17 fév, 09:02, requinham wrote:
>>>> On 17 fév, 09:03, Mickaël Wolff
>>>> wrote:
> [...]
>>> Cette solution de permet de distinguer les types de singleton et
>>> leur durée de vie associée à un évènement:
>>> - détruit par le système (pas enregistré auprès d'un
>>> gestionnaire de singleton)
>>> - détruit explicitment à l'exit ou en sortie de scope
>>> - détruit à la sortie d'un thread (pour les singletons TSS)
>>> - détruit quand une dll est déchargée
>>> - ...
>>> Déjà, une fonction de destruction en sortie de programme ( avec
>>> at_exit() ) devrait couvrir la plupart des cas courants et
>>> t'évitera d'avoir à te creuser la tête pour svaoir quand appele r
>>> destroy().
>>> Le mieux reste quand même de laisser le système réclamer les
>>> ressources - si c'est possible.
>> Cette discussion me rappelle celle-ci, qui faisait intervenir
>> un problème parasite et très génant: l'ordre d'assemblage des
>> modules objets par le linker:
> >http://tinyurl.com/yjng66e
>> (alias
pour)http://groups.google.com/group/fr.comp.lang.c++/browse_thread/thread /..
.
>> 1453053d2/42e34475bd490e9d
>> ...avec finalement impossibilité de compter même sur atexit().
>> Quand à renoncer à restituer les ressources pour laisser le
>> système les reprendre, au-delà du côté frustrant, je ne suis
>> pas sûr que le système puisse tout "fermer" proprement. Ca
>> dépend de la nature des ressources, en y incluant le
>> fonctionnel que l'on implémente:
>> Il va reprendre la mémoire, déclarer abandonnés les mutexes et
>> autres objets system-wide,
>> ...fermer les fichiers ouverts (mais sans flush a priori),
>> ...mais il peut y avoir d'autres éléments fonctionnels codés
>> dans les destructeurs des objets représentant l'application,
>> et qui ne seront pas traités (par exemple: écrire un épilogue
>> dans un fichier avant de le fermer, envoyer une trame "bye"
>> dans une connexion, écrire un log, etc.)
>> Bref, je persiste à penser qu'un last-event exploitable dans
>> le processus fait cruellement défaut.
> Le problème, c'est qu'il n'y a pas de solution possible du
> problème. Que faire, par exemple, si écrire l'épilogue a besoin
> d'autres ressources qui pourraient déjà avoir été libérées ? Il
> peut y avoir des dépendences que ni le système ni le compilateur
> ne peuvent savoir.
Certes! Ca va être un peu long, mais j'aime la précision.
Moi ce que je voudrais, c'est avoir une chance de dépiler
proprement ce que *moi* j'ai pu construire dans l'ordre
inverse.
Je pense en effet qu'il est malsain de compter sur le système
et le compilo pour deviner, et donc que le développeur doit
aller jusqu'au bout de ce qu'il implémente et dont il maîtrise
la logique. Avec un déclencheur adéquat, on pourrait le
faire.
Par exemple, si je disposais d'une callback genre atexit() et
de la garantie qu'elle est invoquée juste avant l'exit du
process, c'est à dire *après le dernier destructeur d'objet
global*, incluant ceux de l'utilisateur, je pourrais m'en
servir.
J'ai beau chercher, je ne vois pas de bonne raison (au sens fonctionnel)
pour qu'une callback de atexit() puisse être intercalée entre les
destructeurs d'objets globaux dans le démontage final.
On Mar 2, 10:18 pm, "Patrick 'Zener' Brunet"
wrote:"James Kanze" a écrit dans le message
de newsOn 22 Feb, 23:24, "Patrick 'Zener' Brunet"
wrote:Bonsoir.
"Michael Doubez" a écrit dans le message
de newsOn 17 fév, 09:02, requinham wrote:On 17 fév, 09:03, Mickaël Wolff
wrote:[...]
Moi ce que je voudrais, c'est avoir une chance de dépiler
proprement ce que *moi* j'ai pu construire dans l'ordre
inverse.
Ça, tu l'as. Tu lèves une exception, que tu attrappes dans main,
et tout ce qu'il y a sur la pile sera dépilé. Dans l'ordre
inverse de la construction. Ce sont les objets dont on a besoin
dans les constructeurs et les destructeurs des objects à durée
de vie statique qui posent un problème.
Je pense en effet qu'il est malsain de compter sur le système
et le compilo pour deviner, et donc que le développeur doit
aller jusqu'au bout de ce qu'il implémente et dont il maîtrise
la logique. Avec un déclencheur adéquat, on pourrait le
faire.Par exemple, si je disposais d'une callback genre atexit() et
de la garantie qu'elle est invoquée juste avant l'exit du
process, c'est à dire *après le dernier destructeur d'objet
global*, incluant ceux de l'utilisateur, je pourrais m'en
servir.
Oui et non. Tu auras toujours le problème de l'ordre des appels
quand il y a eu plusieurs fonctions enrégistrées. Et que faire
si la fonction enrégistrée a besoin d'un objet statique.
[...]J'ai beau chercher, je ne vois pas de bonne raison (au sens
fonctionnel) pour qu'une callback de atexit() puisse être
intercalée entre les destructeurs d'objets globaux dans le
démontage final.
La raison principale, je crois, c'est pour que l'appel des
destructeurs puisse être géré par la logique d'atexit. Quand le
code de démarrage revient de l'appel d'un constructeur, il
enrégistre une fonction qui appelle le destructeur avec atexit.
On Mar 2, 10:18 pm, "Patrick 'Zener' Brunet"
<use.link.in.signat...@ddress.invalid> wrote:
"James Kanze" <james.ka...@gmail.com> a écrit dans le message
de news
2c6e86ad-d834-4e56-aef3-be8fc1865...@y11g2000yqh.googlegroups.com
On 22 Feb, 23:24, "Patrick 'Zener' Brunet"
<use.link.in.signat...@ddress.invalid> wrote:
Bonsoir.
"Michael Doubez" <michael.dou...@free.fr> a écrit dans le message
de news
9b647606-0e73-411a-9d2a-d18b5703d...@o3g2000yqb.googlegroups.com
On 17 fév, 09:02, requinham <requin...@gmail.com> wrote:
On 17 fév, 09:03, Mickaël Wolff <mickael.wo...@laposte.net>
wrote:
[...]
Moi ce que je voudrais, c'est avoir une chance de dépiler
proprement ce que *moi* j'ai pu construire dans l'ordre
inverse.
Ça, tu l'as. Tu lèves une exception, que tu attrappes dans main,
et tout ce qu'il y a sur la pile sera dépilé. Dans l'ordre
inverse de la construction. Ce sont les objets dont on a besoin
dans les constructeurs et les destructeurs des objects à durée
de vie statique qui posent un problème.
Je pense en effet qu'il est malsain de compter sur le système
et le compilo pour deviner, et donc que le développeur doit
aller jusqu'au bout de ce qu'il implémente et dont il maîtrise
la logique. Avec un déclencheur adéquat, on pourrait le
faire.
Par exemple, si je disposais d'une callback genre atexit() et
de la garantie qu'elle est invoquée juste avant l'exit du
process, c'est à dire *après le dernier destructeur d'objet
global*, incluant ceux de l'utilisateur, je pourrais m'en
servir.
Oui et non. Tu auras toujours le problème de l'ordre des appels
quand il y a eu plusieurs fonctions enrégistrées. Et que faire
si la fonction enrégistrée a besoin d'un objet statique.
[...]
J'ai beau chercher, je ne vois pas de bonne raison (au sens
fonctionnel) pour qu'une callback de atexit() puisse être
intercalée entre les destructeurs d'objets globaux dans le
démontage final.
La raison principale, je crois, c'est pour que l'appel des
destructeurs puisse être géré par la logique d'atexit. Quand le
code de démarrage revient de l'appel d'un constructeur, il
enrégistre une fonction qui appelle le destructeur avec atexit.
On Mar 2, 10:18 pm, "Patrick 'Zener' Brunet"
wrote:"James Kanze" a écrit dans le message
de newsOn 22 Feb, 23:24, "Patrick 'Zener' Brunet"
wrote:Bonsoir.
"Michael Doubez" a écrit dans le message
de newsOn 17 fév, 09:02, requinham wrote:On 17 fév, 09:03, Mickaël Wolff
wrote:[...]
Moi ce que je voudrais, c'est avoir une chance de dépiler
proprement ce que *moi* j'ai pu construire dans l'ordre
inverse.
Ça, tu l'as. Tu lèves une exception, que tu attrappes dans main,
et tout ce qu'il y a sur la pile sera dépilé. Dans l'ordre
inverse de la construction. Ce sont les objets dont on a besoin
dans les constructeurs et les destructeurs des objects à durée
de vie statique qui posent un problème.
Je pense en effet qu'il est malsain de compter sur le système
et le compilo pour deviner, et donc que le développeur doit
aller jusqu'au bout de ce qu'il implémente et dont il maîtrise
la logique. Avec un déclencheur adéquat, on pourrait le
faire.Par exemple, si je disposais d'une callback genre atexit() et
de la garantie qu'elle est invoquée juste avant l'exit du
process, c'est à dire *après le dernier destructeur d'objet
global*, incluant ceux de l'utilisateur, je pourrais m'en
servir.
Oui et non. Tu auras toujours le problème de l'ordre des appels
quand il y a eu plusieurs fonctions enrégistrées. Et que faire
si la fonction enrégistrée a besoin d'un objet statique.
[...]J'ai beau chercher, je ne vois pas de bonne raison (au sens
fonctionnel) pour qu'une callback de atexit() puisse être
intercalée entre les destructeurs d'objets globaux dans le
démontage final.
La raison principale, je crois, c'est pour que l'appel des
destructeurs puisse être géré par la logique d'atexit. Quand le
code de démarrage revient de l'appel d'un constructeur, il
enrégistre une fonction qui appelle le destructeur avec atexit.
Dans la logique que j'exposais, je m'attendrais (même si ça ce marche pas,
objet du débat) à ce qu'en tant que last-event, elle soit appelée d urant
l'exit, après le dernier destructeur d'objet global.
Et donc logiquement elle ne devrait plus toucher à ces objets. Par cont re
elle pourrait démanteler un objet construit sur le heap et attaché à un
pointeur static, c'est la solution de repli que j'espérais.
Plusieurs callbacks atexit() enregistrées ? Et bien en toute logique el les
devraient être invoquées dans l'ordre inverse, ce qui serait parfait pour
moi.
D'ailleurs pour déclencher proprement les destructeurs, cet ordre inver se
doit être respecté a priori.
Sauf que le mix avec les destructeurs fausse tout,
mais tu donnes l'explication ci-dessous:
> [...]
>> J'ai beau chercher, je ne vois pas de bonne raison (au sens
>> fonctionnel) pour qu'une callback de atexit() puisse être
>> intercalée entre les destructeurs d'objets globaux dans le
>> démontage final.
> La raison principale, je crois, c'est pour que l'appel des
> destructeurs puisse être géré par la logique d'atexit. Quand le
> code de démarrage revient de l'appel d'un constructeur, il
> enrégistre une fonction qui appelle le destructeur avec atexit.
Berk Berk Beuâârk ! voilà qui explique tout !
Si le framework commence à utiliser lui-même les quelques
primitives qu'il laisse à l'Utilisateur et les contraint de la
sorte, évidemment ça coince bien Pourtant il y a un moment que
les compilos C++ ne passent plus par une conversion en C.
Fâcheuse interaction àmha: l'API Utilisateur c'est rien que
pour l'Utilisateur.
Dans la logique que j'exposais, je m'attendrais (même si ça ce marche pas,
objet du débat) à ce qu'en tant que last-event, elle soit appelée d urant
l'exit, après le dernier destructeur d'objet global.
Et donc logiquement elle ne devrait plus toucher à ces objets. Par cont re
elle pourrait démanteler un objet construit sur le heap et attaché à un
pointeur static, c'est la solution de repli que j'espérais.
Plusieurs callbacks atexit() enregistrées ? Et bien en toute logique el les
devraient être invoquées dans l'ordre inverse, ce qui serait parfait pour
moi.
D'ailleurs pour déclencher proprement les destructeurs, cet ordre inver se
doit être respecté a priori.
Sauf que le mix avec les destructeurs fausse tout,
mais tu donnes l'explication ci-dessous:
> [...]
>> J'ai beau chercher, je ne vois pas de bonne raison (au sens
>> fonctionnel) pour qu'une callback de atexit() puisse être
>> intercalée entre les destructeurs d'objets globaux dans le
>> démontage final.
> La raison principale, je crois, c'est pour que l'appel des
> destructeurs puisse être géré par la logique d'atexit. Quand le
> code de démarrage revient de l'appel d'un constructeur, il
> enrégistre une fonction qui appelle le destructeur avec atexit.
Berk Berk Beuâârk ! voilà qui explique tout !
Si le framework commence à utiliser lui-même les quelques
primitives qu'il laisse à l'Utilisateur et les contraint de la
sorte, évidemment ça coince bien Pourtant il y a un moment que
les compilos C++ ne passent plus par une conversion en C.
Fâcheuse interaction àmha: l'API Utilisateur c'est rien que
pour l'Utilisateur.
Dans la logique que j'exposais, je m'attendrais (même si ça ce marche pas,
objet du débat) à ce qu'en tant que last-event, elle soit appelée d urant
l'exit, après le dernier destructeur d'objet global.
Et donc logiquement elle ne devrait plus toucher à ces objets. Par cont re
elle pourrait démanteler un objet construit sur le heap et attaché à un
pointeur static, c'est la solution de repli que j'espérais.
Plusieurs callbacks atexit() enregistrées ? Et bien en toute logique el les
devraient être invoquées dans l'ordre inverse, ce qui serait parfait pour
moi.
D'ailleurs pour déclencher proprement les destructeurs, cet ordre inver se
doit être respecté a priori.
Sauf que le mix avec les destructeurs fausse tout,
mais tu donnes l'explication ci-dessous:
> [...]
>> J'ai beau chercher, je ne vois pas de bonne raison (au sens
>> fonctionnel) pour qu'une callback de atexit() puisse être
>> intercalée entre les destructeurs d'objets globaux dans le
>> démontage final.
> La raison principale, je crois, c'est pour que l'appel des
> destructeurs puisse être géré par la logique d'atexit. Quand le
> code de démarrage revient de l'appel d'un constructeur, il
> enrégistre une fonction qui appelle le destructeur avec atexit.
Berk Berk Beuâârk ! voilà qui explique tout !
Si le framework commence à utiliser lui-même les quelques
primitives qu'il laisse à l'Utilisateur et les contraint de la
sorte, évidemment ça coince bien Pourtant il y a un moment que
les compilos C++ ne passent plus par une conversion en C.
Fâcheuse interaction àmha: l'API Utilisateur c'est rien que
pour l'Utilisateur.