Problems with std.experimental.allocator
Igor via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Sep 2 04:23:00 PDT 2017
I realize these are not yet stable but I would like to know if I
am doing something wrong or is it a lib bug.
My first attempt was to do this:
theAllocator = allocatorObject(Region!MmapAllocator(1024*MB));
If I got it right this doesn't work because it actually does this:
1. Create Region struct and allocate 1024MB from MMapAllocator
2. Wrap the struct in IAllocator by copying it because it has
state
3. Destroy original struct which frees the memory
4. Now the struct copy points to released memory
Am I right here?
Next attempt was this:
theAllocator =
allocatorObject(Region!()(cast(ubyte[])MmapAllocator.instance.allocate(1024*MB)));
Since I give actual memory instead of the allocator to the Region
it can not dealocate that memory so even the copy will still
point to valid memory. After looking at what will the
allocatorObject do in this case my conclusion is that it will
take a "copyable" static if branch and create an instance of
CAllocatorImpl which will have a "Region!() impl" field within
itself but given Region!() struct is never copied into that field.
Am I right here?
If I am right about both are then these considered as lib bugs?
I finally got it working with:
auto newAlloc =
Region!()(cast(ubyte[])MmapAllocator.instance.allocate(1024*MB));
theAllocator = allocatorObject(&newAlloc);
Next I tried setting processAllocator instead of theAllocator by
using:
auto newAlloc =
Region!()(cast(ubyte[])MmapAllocator.instance.allocate(1024*MB));
processAllocator = sharedAllocatorObject(&newAlloc);
but that complained how it "cannot implicitly convert expression
`pa` of type `Region!()*` to `shared(Region!()*)`" and since
Region doesn't define its methods as shared does this mean one
can not use Region as processAllocator? If that is so, what is
the reason behind it?
More information about the Digitalmars-d-learn
mailing list