On Saturday, 21 January 2017 at 02:47:49 UTC, bitwise wrote:
When std.experimental.allocator was created, I was under the
impression it was meant to be used to make containers. But
since allocate() returns void[], casts are required before
using that memory, which is unsafe.
Is my only option to wrap the casts in an @trusted helper
function? or am I missing something?
Thanks
System functions that do memory allocation, give you a memory
block as a void*. So a cast is anyway required to cast to the
required data type.
Allocators don't cast from void* because you would need to
implement the same logic in each allocator. Therefore there are
functions like make/makeArray/dispose that take an allocator,
cast and initialize data.
As for safity part. Allocators can't provide the same safity as
the garbage collector anyway, because if you use manual memory
management you get all the problems like you can pass to
deallocate() a wrong pointer or to free a memory block twice. But
with the right abstractions and enough testing, you can reduce
such problems and make the code more trusted.
Alligned allocator isn't present in the
std.experimental.allocator because IAllocator has a method
alignedAllocate() (or similar) - so any allocator can be designed
to provide aligned allocations.