OVH Cloud OVH Cloud

Détruire un objet de façon déterministe

3 réponses
Avatar
Thierry Laurent
Bonjour,

Connaissez-vous un moyen de détruire un objet de façon déterministe ?
(j'ai besoin d'exécuter des opérations importantes juste au moment où
l'objet est détruit mais on ne contrôle pas le moment du déclenchement du
garbage collector).

D'avance, merci pour votre aide,
Thierry

3 réponses

Avatar
Ambassadeur Kosh
> Bonjour,

Connaissez-vous un moyen de détruire un objet de façon déterministe ?
(j'ai besoin d'exécuter des opérations importantes juste au moment où
l'objet est détruit mais on ne contrôle pas le moment du déclenchement du
garbage collector).



le meilleur moyen de lui faire faire ces operations importantes, c'est de le
lui demander en passant par une methode.

sinon, le Dispose sur les objets disposables, mais bon, pourquoi s'acharner
à vouloir le detruire ? quelle importance cela peut il avoir qu'il se balade
dans la mémoire en attendant de passer au Garbage ?
Avatar
Paul Bacelar
"Ambassadeur Kosh" wrote in message
news:
> Bonjour,
>
> Connaissez-vous un moyen de détruire un objet de façon déterministe ?
> (j'ai besoin d'exécuter des opérations importantes juste au moment où
> l'objet est détruit mais on ne contrôle pas le moment du déclenchement


du
> garbage collector).

le meilleur moyen de lui faire faire ces operations importantes, c'est de


le
lui demander en passant par une methode.

sinon, le Dispose sur les objets disposables, mais bon, pourquoi


s'acharner
à vouloir le detruire ? quelle importance cela peut il avoir qu'il se


balade
dans la mémoire en attendant de passer au Garbage ?





Avec le mot clé "using", l'utilisation de l'interface IDisposable est très
intuitive ;-)

--
Paul Bacelar
Avatar
Bruno Jouhier [MVP]
"Thierry Laurent" <Thierry a écrit dans
le message de news:
Bonjour,

Connaissez-vous un moyen de détruire un objet de façon déterministe ?
(j'ai besoin d'exécuter des opérations importantes juste au moment où
l'objet est détruit mais on ne contrôle pas le moment du déclenchement du
garbage collector).



L'interface IDisposable et la construction "using" sont la voie à suivre si
ton object a une référence vers une resource non managée (voir les autres
posts). Dans ce cas, tu appelles la méthode Dispose (ou tu laisses using le
faire pour toi) lorsque tu n'as plus besoin de l'objet. Ca libèrer la
ressource non managée (ce n'est pas magique, tu dois le coder dans ton
Dispose), mais ça ne libère pas la mémoire utilisée par l'objet. Ca, c'est
le GC qui s'en charge.

Si tu tiens vraiment à forcer la libération de la mémoire, il faut:
1) t'assurer que toutes les références vers l'objet ont été coupées
(reassignées, remises à null, etc.)
2) appeler GC.Collect() pour forcer un cycle de GC complet (c'est coûteux,
surtout si tu as beaucoup d'objets en mémoire).

Si tu as un traitement à faire au moment précis où l'objet est libéré, tu
peux utiliser un "finaliseur" (la syntaxe est comme un destructeur C++).
Dans ce cas, tu peux appeler GC.WaitForPendingFinalizers() pour forcer
l'exécution de tous les finaliseurs (sinon, ton finaliseur sera appelé
directement par le GC, dans un thread que tu ne contrôles pas).

L'utilisation des finaliseurs est déconseillée car ça oblige le GC à faire 2
passes pour libérer l'objet (1 passe pour le mettre dans la queue de
finalisation + une passe pour libérer la mémoire). Si tu l'utilises de
manière intensive, ça risque de diminuer l'efficacité du GC.

Un conseil: dans un premier temps, laisse le GC faire son boulot le plus
naturellement possible. Ensuite, si tu as vraiment des problèmes ou des
besoins très spécifiques (et vraiment justifiés), regarde les finaliseurs et
les APIs GC, mais ne fonce pas dans cette direction sans avoir acquis un peu
d'expérience avec le GC. Quel genre de traitement as tu besoin de faire au
moment où l'objet est libéré?

Bruno.


D'avance, merci pour votre aide,
Thierry