What is the Correct way to Malloc in @nogc section?

Kitt via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Feb 12 15:27:50 PST 2015


I'm currently trying to write a personal Associate Array class 
that can be used in @nogc sections. Obviously, this means I'll 
want to use malloc/free, however I'm not sure what the "Correct" 
way to do this is. In a few places online I've seen code for 
custom "_new" and "_delete" functions similar to this:

[code]
T _new(T, Args...) (Args args) {
     size_t objSize;
	static if(is (ValType == class))
	    objSize = __traits(classInstanceSize, T);
	else
	    objSize = T.sizeof;

     void* tmp = core.stdc.stdlib.malloc(objSize);
     if (!tmp) throw new Exception("Memory allocation failed");
     void[] mem = tmp[0..objSize];
     T obj = emplace!(T, Args)(mem, args);
     return obj;
}

void _delete(T)(T obj) {
     clear(obj);
     core.stdc.stdlib.free(cast(void*)obj);
}
[/code]

The Exception obviously uses the GC, and would need to be 
replaced with a printf or something; however, emplace doesn't 
have a @nogc replacement that I know of. What I'd like to know, 
from people much more knowledgeable about the ins and outs of D, 
is what the "Best" or "Correct" way to allocate and deallocate 
within @nogc sections?

PS: Tangentially related, what hashing algorithm does D use? I've 
seen people suggest using typeid(object).toHash(&object); 
however, toHash isn't @nogc, so I need to write my own Hashing 
function. For the sake of consistency and peace of mind, I'd 
really like to match mine as closely to Ds internal one as 
possible.


More information about the Digitalmars-d-learn mailing list