Please help with GC exception!
Steven Schveighoffer
schveiguy at yahoo.com
Wed May 9 09:43:30 PDT 2012
On Wed, 09 May 2012 12:12:55 -0400, Gor Gyolchanyan
<gor.f.gyolchanyan at gmail.com> wrote:
> I'm not deleting the member. I'm deleting memory, allocated by the
> member.
The member is a struct, so it's fully contained within the class's block.
Therefore, the memory block is a member, even if indirectly so.
> If GC deleted it before the object, the same error would appear when I
> forced a GC collection cycle.
> Also, docs clearly say, that I'm free to delete the memory myself.
> This means, that I shouldn't care if a collection cycle went before my
> deletion!
Here is how it works. This is not your example, it's an even simpler one.
Memory block A has a pointer to memory block B. Both are GC allocated. A
is an object with a dtor that calls GC.delete(B). Since A has the only
pointer to B, B is not removed by the GC as long as A is pointed at.
Now, A is no longer pointed at, and a GC collection runs.
The GC marks all memory, does not mark A, and therefore, does not mark B,
so now A and B are scheduled for deletion.
After the mark period, the GC cycles through all deletable (unmarked)
memory blocks, and finds *B first*. Since B has no dtor, it's simply
deallocated.
However, A has a destructor. So first, the runtime runs A.__dtor(), which
*again* deletes B. This is where the failure occurs.
For this reason, you cannot have a destructor which deletes GC-allocated
memory. This is even in the spec.
-Steve
More information about the Digitalmars-d
mailing list