Eliminate class allocators and deallocators?
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Wed Oct 7 11:25:06 PDT 2009
Jeremie Pelletier wrote:
> Andrei Alexandrescu wrote:
>> Hello,
>>
>>
>> D currently allows defining class allocators and deallocators. They
>> have a number of problems that make them unsuitable for D 2.0. The
>> most obvious issue is that D 2.0 will _not_ conflate destruction with
>> deallocation anymore: invoking delete against an object will call
>> ~this() against it but will not recycle its memory. In contrast, class
>> deallocators are designed around the idea that invoking delete calls
>> the destructor and also deallocates memory.
>>
>> So I'm thinking of removing at least class deallocators from the
>> language. Class allocators may be marginally and occasionally useful
>> if the user takes the matter of deallocation in her own hands.
>>
>> A much better way to handle custom allocation of classes would be in
>> the standard library.
>>
>> What do you think?
>>
>>
>> Andrei
>
> I wouldn't like delete to go away at all, I use it for all my non-gc
> objects like this watered down example:
>
> class ManualObject : Object {
> new(size_t size) { return malloc(size); }
> delete(void* mem) { free(mem); }
> }
>
> And then I can easily subclass it for any objects that doesn't need the
> GC. I've got similar constructs for arrays and structs.
Clearly you use those objects in a very different manner than GC
objects. So by using new/delete with them you're fooling yourself.
// untested
class ManualObject {
static T create(T : ManualObject)() {
auto p = malloc(__traits(classInstanceSize, T));
memcpy(p, T.classinfo.init.ptr, __traits(classInstanceSize, T));
auto result = cast(T) p;
result.__ctor();
return result;
}
static void yank(ManualObject obj) {
free(cast(void*) obj);
}
}
Looks like a fair amount of work? At some level it actually should, but
we can put that kind of stuff in the standard library.
> malloc/free are nice, but they don't allow for elegant abstractions like
> new/delete does (for example if you want to use a specialized non-gc
> allocator you can just replace a few calls instead of every allocation).
They do if you're willing to write just a bit of scaffolding.
> I also use delete when I no longer need large blocks of memory, I don't
> want them to just become uninitialized and sitting on the GC. When I
> want to do that I just nullify my references.
>
> If you're afraid of deleting an object that may still have valid
> references, use smart pointers, or don't delete it at all if it sits on
> the gc and just call a .destroy() method.
>
> Also in my runtime the delete implementations do free the memory, they
> don't just call the finalizer.
>
> In any ways, just don't remove new/delete overrides from the language
> please, just call it a low-level technique or something to scare the
> beginners away and let people who want it have it :)
I strongly believe custom new/delete must go.
Andrei
More information about the Digitalmars-d
mailing list