Bug? GC collects memory that references itself.

Stewart Gordon smjg_1998 at yahoo.com
Thu Oct 29 15:02:39 PDT 2009


Jeremie Pelletier wrote:
> Simen Kjaeraas wrote:
>> Jeremie Pelletier <jeremiep at gmail.com> wrote:
>>
>>> I need objects that may live without any references in GC memory, 
>>> this is for bindings to a C++ library. Using ranges or roots would be 
>>> very inneficient so my solution was to have the objects reference 
>>> themselves until the C++ side of the object calls a finalizer which 
>>> nullify the reference to let the GC collect the memory.
>>>
>>> The GC doesn't see things this way however, and collects the objects 
>>> even when they reference themselves.

Correct.  For a GC-allocated object to remain alive, it must be 
reachable, i.e. there must exist a chain of references that leads to it 
from at least one of:
- each thread's stack
- the static data segment
- the list of roots added using std.gc.addRoot or std.gc.addRange.

The existence of some reference of it somewhere in the heap is not 
sufficient.  If it were, the GC would be very slow, since it would have 
to either
- scan every bit of heap-allocated memory, not just what is reachable
- use reference counting, itself a performance hit

<snip>
> It would be too slow for the GC to manage hundreds or thousands of roots.

Really?  Have you experimented?

> I think I'm just going to use an array of pointers and let the objects 
> know their index in that array, it seems to be the fastest solution with 
> the GC.

Certainly one way to do it, though I'm a little confused about why 
adding GC roots would be any slower than this.

> The D class tree for the C++ interface can be subclassed so they 
> will most likely contain references to D memory.
<snip>

If that's the case, there will likely be a number of GC nodes for each 
of your special objects, and so an extra one surely isn't going to add 
up to much.

Stewart.


More information about the Digitalmars-d-learn mailing list