Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

libérer objet com

6 réponses
Avatar
Sylfelin
Bonjour,

Je sais c'est le gc qui le fait mais si je fait

ObjetComm obj = new ObjetComm();

puis

obj = null;

Quelle sont le résultat de ce code sur la mémoire, l'objet et sur le
comportement du gc ?

Merci

--

--------------------------
Merci
Sylfelin

6 réponses

Avatar
Christophe Lephay
"Sylfelin" a écrit dans le message de news:

Je sais c'est le gc qui le fait mais si je fait

ObjetComm obj = new ObjetComm();

puis

obj = null;

Quelle sont le résultat de ce code sur la mémoire, l'objet et sur le
comportement du gc ?



L'objet créé par 'instruction new ObjetComm() sera supprimé de la mémoire au
prochain Collect du GB s'il n'a pas été référencé auparavant (par exemple
via un ObjetComm obj2 = obj; avant l'instruction obj=null;).

Tu ne peux rien supposer sur le moment où cette suppression aura lieu, et
donc sur l'appel du dstructeur s'il existe, sauf si tu déclanches toi-même
le ramassage via GC.Collect() (déconseillé).

Quant à l'impact sur la mémoire, le gc va vraissemblablement conserver la
mémoire libérée pour un usage ultérieur.
Avatar
Sylfelin
> avant l'instruction obj=null;)



=null détruit donc l'objet ?

--

--------------------------
Merci
Sylfelin
Avatar
Gilles TOURREAU
Le Thu, 18 Oct 2007 17:21:38 +0200, Sylfelin
a écrit:

avant l'instruction obj=null;)



=null détruit donc l'objet ?




Non...

C'est le GC qui le fera plus-tard, s'il n'existe aucune référence à votre
objet...

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Patrick Philippot
Bonjour,

obj = null;

Quelle sont le résultat de ce code sur la mémoire, l'objet et sur le
comportement du gc ?



obj = null n'a aucun effet sur le GC. Le GC de .Net ne travaille pas comme
le COM par comptage de références. On vérifie en permanence l'accessibilité
d'une instance via les différentes références qui pointent sur elle. Si
l'instance n'est plus accessible, elle est candidate au garbage collect.
Quand ce garbage collect aura lieu dépend de la génération dans laquelle se
trouve actuellement l'instance et de nombreux autres facteurs. Plus l'objet
a vécu, plus il a de chances de vivre encore longtemps - j'adorerais que ce
principe s'applique également au programmeur - et plus il a de chances de se
trouver en génération 1 ou 2 et plus en génération 0. Ce qui a pour
conséquence de retarder encore plus le moment où le GC va se décider à
l'évacuer.

Le principe est qu'on ne libère pas de mémoire si on n'a pas besoin de le
faire. Cela rend l'action du GC discrète, rapide, opportune et efficace.

Ce principe général s'applique donc au RCW (Runtime Callable Wrapper), objet
.Net qui encapsule l'objet COM. Le release ne sera fait sur l'objet COM que
lorsque le RCW sera garbage collecté. Cependant, on peut forcer le release
au sens COM du terme en appelant Marshal.ReleaseCOmObject(obj) ce qui a pour
effet de décrémenter le reference count de l'objet COM encapsulé.
ReleaseComObject retournant le nouveau reference count, un moyen radical
d'évacuer l'objet COM est de faire

while (Marshal.ReleaseComObject(obj) > 0) {}

Cela provoquera l'évacuation de l'objet COM encapsulé. Cependant, la
"coquille" (le RCW) sera toujours vivante. C'est le GC qui décidera de sa
destruction.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Sylfelin
> trouve actuellement l'instance et de nombreux autres facteurs. Plus l'objet a
vécu, plus il a de chances de vivre encore longtemps - j'adorerais que ce
principe s'applique également au programmeur -



Joli trait d'humour; Merci pour tes explications.

--

--------------------------
Merci
Sylfelin
Avatar
Delf
On 18 oct, 18:44, "Patrick Philippot"
wrote:

Plus l'objet a vécu, plus il a de chances de vivre encore longtemps - j 'adorerais
que ce principe s'applique également au programmeur - et plus il a de c hances
de se trouver en génération 1 ou 2 et plus en génération 0. Ce qu i a pour
conséquence de retarder encore plus le moment où le GC va se décide r à
l'évacuer.



Et si la mémoire venait à manquer sur l'OS, est-ce-que le GC
libèrerait les objets 'à hautes générations' ?
Merci.

--
Delf