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