Destructor nonsense on

foobar foo at
Sat May 26 05:28:49 PDT 2012

On Saturday, 26 May 2012 at 11:35:29 UTC, Jacob Carlborg wrote:
> On 2012-05-25 14:05, foobar wrote:
>>> If you have a pointer to a struct you don't know how it was 
>>> created.
>>> It's possible it's been created with "new", which means the 
>>> garbage
>>> collector needs to delete it.
>> let's say we add two classes:
>> class FooA {
>> A a;
>> }
>> class FooPA {
>> A* pa;
>> }
>> For the first case, both the class and the struct share the 
>> same
>> lifetime thus when an instance of FooA is GC-ed, the GC would 
>> call A's
>> d-tor and allow it to do what-ever (self) cleaning it 
>> requires. This
>> means the d-tor will always be called.
> Is that the cases even if the destructor of FooA isn't called?

Huh? In my model FooA has no destructor.

>> For the second case, The GC will only scan "pa" to find inner 
>> class
>> instances but will *not* handle the struct value itself.
>> In order to clean what "pa" points to, you need to explicitly 
>> call the
>> destructor yourself.
> Are you saying that the GC won't collect a struct allocated 
> with "new"?
> "NewExpressions are used to allocate memory on the garbage 
> collected heap...". I though that everything allocated via the 
> GC was also collected by the GC.

I indeed propose that structs allocated with "new" will be put in 
region of the heap *not* managed by the GC. It's a tiny price to 
pay to get more orthogonal semantics which are easier to reason 
Please note that this only affects code that directly uses 
pointers which is not common in D and is geared towards more 
advanced use cases where the programmer will likely want to 
manage the memory explicitly anyway.

>> One way to do this would be to register a callback
>> with the GC to get notified when an instance of FooPA is 
>> collected and
>> inside the callback function maintain a reference-counter.
>> This also means that if you allocate a struct value on the 
>> heap via
>> "new" you are responsible to call delete _yourself_ and the gc 
>> will not
>> call it for you.
>> I think that loosing this small convenience is worth it - we 
>> gay more
>> orthogonal semantics that are easier to reason about.

More information about the Digitalmars-d mailing list