how to allocate class without gc?

Basile B. via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jan 26 22:40:00 PST 2016


On Tuesday, 26 January 2016 at 01:09:50 UTC, Igor wrote:
> Is there any examples that shows how to properly allocate an 
> object of a class type with the new allocators and then release 
> it when desired?

This is more or less the same answer as you've get previously 
except that I don't use emplace but rather a copy of what's done 
in _d_new_class() from the D runtime:

CT construct(CT, A...)(A a) @trusted @nogc
if (is(CT == class))
{
     import std.experimental.allocator.mallocator;
     auto size = typeid(CT).init.length;
     auto memory = Mallocator.instance.allocate(size); // D 
runtime use GC here
     memory[0 .. size] = typeid(CT).init[];
     static if (__traits(hasMember, CT, "__ctor"))
         (cast(CT) (memory.ptr)).__ctor(a);
     import core.memory: GC;
     GC.addRange(memory.ptr, size, typeid(CT));
     return cast(CT) memory.ptr;
}

the GC stuff could look superfluous but without this and if 
there's a GC allocated members in your class (even a simple 
dynamic array) then you'll encounter random errors at run-time.


More information about the Digitalmars-d-learn mailing list