GC-proof resource classes

byron via Digitalmars-d digitalmars-d at puremagic.com
Mon Aug 31 07:18:41 PDT 2015


On Monday, 31 August 2015 at 13:35:54 UTC, ponce wrote:
> On Monday, 31 August 2015 at 12:54:05 UTC, Sebastiaan Koppe 
> wrote:
>> What about:
>>
>> ```
>> class MyResource
>> {
>>     void* handle;
>>     this()
>>     {
>>         handle = create_handle();
>>     }
>>     close()
>>     {
>>         if (handle)
>>             free_handle(handle)
>>         handle = null;
>>     }
>>     ~this()
>>     {
>>         enforce(!handle,"Resource leak");
>>     }
>> }
>> ```
>
>
>
> Unique!T destructor calls delete which calls ~this() not close()
> RefCounted!T and scoped!T call .destroy which calls ~this() not 
> close()
> We really want one thing there.

I normally stick with this pattern when dealing with resource, 
though I would only uses a class if I needed an interface or 
inheritance..


```
class MyResource
{
     void* handle;
     this()
     {
         handle = create_handle();
     }

     close()
     {
         if (handle !is null)
         {
             synchronized {
                 if (handle !is null) {
                     free_handle(handle);
                 }
             }
             handle = null;
         }
     }

     ~this()
     {
         close();
     }
}
```




More information about the Digitalmars-d mailing list