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.

Reply via email to