On May 9, 2012, at 8:28 AM, Gor Gyolchanyan wrote:
> I have a structure:
>
> private struct Block
> {
> this(size_t n) { /* allocate n bytes with GC.malloc */ }
> this(this) { /* deep-copy the bytes */ }
> ~this() { /* deallocate them with GC.free */ }
> }
>
> And a class:
>
> final class Region
> {
> private Block _block;
> alias _block this;
> }
>
>
> This setup allows me to have memory regions, reallocation of which
> will never invalidate pointers, because thanks to Region class no-one
> holds a direct pointer to the memory.
> The problem is, that I get a
> core.exception.InvalidMemoryOperationError when my program ends.
When your program ends, the class instance is collected by the GC, so you're
effectively calling GC.free within a class finalizer. The GC currently doesn't
support this. Does this memory have to be scannable by the GC or could you use
C malloc instead?