www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - class destructors and sub-objects

reply d coder <dlang.coder gmail.com> writes:
Greetings

I have a question on class destructor method. D documentation for
destructors says:

"The garbage col=ADlec=ADtor is not guar=ADan=ADteed to run the de=ADstruc=
=ADtor for
all un=ADref=ADer=ADenced ob=ADjects. Fur=ADther=ADmore, the order in which=
 the garbage
col=ADlec=ADtor calls de=ADstruc=ADtors for un=ADref=ADer=ADence ob=ADjects=
 is not
spec=ADi=ADfied. This means that when the garbage col=ADlec=ADtor calls a
de=ADstruc=ADtor for an ob=ADject of a class that has mem=ADbers that are
ref=ADer=ADences to garbage col=ADlected ob=ADjects, those ref=ADer=ADences=
 may no
longer be valid. This means that de=ADstruc=ADtors can=ADnot ref=ADer=ADenc=
e sub
ob=ADjects."


Now I have a class A and it refers to subobject B. But B may or may not
have other objects referring to it. As a result, an object of A is GCed,
but subobject B may or may not be getting garbage collected.

In this scenario, am I allowed to make a reference to subobject B from the
destructor of A? Is there a way to find out if B is garbage collected or
not?

Regards
- Puneet
Aug 29 2013
parent =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 08/29/2013 06:58 AM, d coder wrote:> Greetings
 I have a question on class destructor method. D documentation for
 destructors says:

 "The garbage col­lec­tor is not guar­an­teed to run the de­struc­tor for
 all un­ref­er­enced ob­jects. Fur­ther­more, the order in which the 
garbage
 col­lec­tor calls de­struc­tors for un­ref­er­ence ob­jects is not
 spec­i­fied. This means that when the garbage col­lec­tor calls a
 de­struc­tor for an ob­ject of a class that has mem­bers that are
 ref­er­ences to garbage col­lected ob­jects, those ref­er­ences may no
 longer be valid. This means that de­struc­tors can­not ref­er­ence sub
 ob­jects."


 Now I have a class A and it refers to subobject B. But B may or may not
 have other objects referring to it. As a result, an object of A is GCed,
 but subobject B may or may not be getting garbage collected.

 In this scenario, am I allowed to make a reference to subobject B 
from the
 destructor of A?
The way I read it, it is exactly what the documentation warns against. No, A's destructor cannot reference B member.
 Is there a way to find out if B is garbage collected or
 not?
Not on B member itself because it is no more. :) It is conceivable to maintain a bitmap to determine whether an object is still alive. The object's destructor can flip its bit to 0.
 Regards
 - Puneet
Ali
Aug 29 2013