GC-proof resource classes

cym13 via Digitalmars-d digitalmars-d at puremagic.com
Sat Aug 29 06:43:32 PDT 2015


On Saturday, 29 August 2015 at 13:14:26 UTC, ponce wrote:
> This makes GC-called destructors mostly useless for non-memory 
> resource release. IIRC Andrei suggested once that destructors 
> shouldn't be called at all by the GC, something that I agree 
> with.
>
> As such, some of us started providing a 
> release()/dispose()/close() method, and have the destructor 
> call it to support both scoped ownership and manual release.

I'm not sure it is the best way to do things... In Python for 
example we have a GC that calls the default destructor (__del__ 
method). As a consequence, if you need some resource to be freed 
you have to do it explicitely by writting a close()/whatever() 
method. But nobody's linking the destructor to it because of the 
separation of concerns principle: we release what has to be 
released and only that: freeing the object is the realm of the 
GC. This mixed style is something I have yet to encounter in D 
where it could be way more powerful than in Python: free what you 
must, not what you can.

> But that introduce accidentally correct design when the 
> destructor is called by GC, and avoids a leak. This is arguably 
> worse than the initial problem.

I'd like to see a concrete example of this, it seems I'm missing 
something...

> void ensureNotInGC(string resourceName) nothrow
> {
>     debug
>     {
>         import core.exception;
>         try
>         {
>             import core.memory;
>             void* p = GC.malloc(1); // not ideal since it 
> allocates
>             return;
>         }
>         catch(InvalidMemoryOperationError e)
>         {
>             import core.stdc.stdio;
>             fprintf(stderr, "Error: clean-up of %s incorrectly 
> depends on destructors called by the GC.\n", resourceName.ptr);
>             assert(false); // crash
>         }
>     }
> }
>
> --------------
>
> Looks ugly? Yes, but it makes the GC acts as a cheap leak 
> detector, giving accurate messages for still opened resources.

As I said before, I'm not sure preventing the GC from doing its 
collection job is a good idea, but I find the concept of having 
such a leak detector really interesting!



More information about the Digitalmars-d mailing list