More radical ideas about gc and reference counting

via Digitalmars-d digitalmars-d at puremagic.com
Sun May 4 03:34:25 PDT 2014


On Friday, 2 May 2014 at 21:12:12 UTC, H. S. Teoh via 
Digitalmars-d wrote:
> On Fri, May 02, 2014 at 09:03:15PM +0000, monarch_dodra via 
> Digitalmars-d wrote:
>> On Friday, 2 May 2014 at 15:06:59 UTC, Andrei Alexandrescu 
>> wrote:
>> >So now it looks like dynamic arrays also can't contain 
>> >structs with
>> >destructors :o). -- Andrei
>> 
>> Well, that's always been the case, and even worst, since in a 
>> dynamic
>> array, destructor are guaranteed to *never* be run. 
>> Furthermore, given
>> the "append causes relocation which duplicates", you are almost
>> *guaranteed* to leak your destructors. You just can't keep 
>> track of
>> the usage of a "naked" dynamic array.
>> 
>> This usually comes as a great surprise to users in ".learn". 
>> It's also
>> the reason why using "File[]" never ends well...
>
> This is why I'm unhappy with the way this is going. Current 
> behaviour of
> structs with dtors is already fragile enough, now we're pulling 
> the rug
> out from under classes as well. So that will be yet another 
> case where
> dtors won't work as expected.
>
> I'm getting the feeling that dtors were bolted on as an 
> afterthought,
> and only works properly for a very narrow spectrum of use 
> cases. Rather
> than expand the usable cases, we're proposing to reduce them 
> (by getting
> rid of class dtors). I can't see *this* ending well either. :-(

Unfortunately, the rug they are standing is placed over a gaping 
hole in the ground, metaphorically speaking, so it never was a 
very stable situation to begin with. I'm not sure it makes sense 
to put much effort into increasing the likelihood that 
destructors are called, when we then _still_ can't guarantee it.

Better to acknowledge that it simply can't work (if that's the 
case), and try to find a way to avoid these situations. For 
example, we could statically forbid GC managed objects with 
destructors (not classes, but _anything_ GC managed). That means 
that calling new for these types, or allocating a dynamic array 
of them, will be an error. Of course, an escape hatch needs to be 
put in place. "isolated" might be a candidate.


More information about the Digitalmars-d mailing list