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.

Reply via email to