Re: why isn't there a placement delete syntax
andrew_nuss@yahoo.com ha scritto:
Alberto Ganesh Barbati wrote:
void* operator new (Heap& h, size_t n)
{
// alloc some more space to hold the extra info
void* ptr = h.alloc(n + sizeof(Heap*));
Heap* hptr = static_cast<Heap*>(ptr);
*hptr = &h; // store info in the block
return hptr + 1;
}
I like this solution but I do have a question. Will it fail on some
platforms with tricky alignment issues because the sizeof(Heap*) header
leaves the logical void* addr returned on an unaligned boundary? Or is
sizeof(Heap*) always on an alignment boundary, even for doubles?
The returned address could be on an unaligned boundary. If you care
about alignment issues, you need to know the strictest alignment
requirement of your platform. malloc() and ::operator new are guaranteed
to always return pointers aligned to that quantity and I assume that
also h.alloc() does the same. Then you define HeaderSize as the minimum
common multiple between that quantity and sizeof(Heap*) and modify the
code in this way:
void* operator new (Heap& h, size_t n)
{
// alloc some more space to hold the extra info
void* ptr = h.alloc(n + HeaderSize);
*static_cast<Heap**>(ptr) = &h;
return static_cast<char*>(ptr) + HeaderSize;
}
I just realized that I missed a "*" in my previous post. It's Heap** not
Heap* in the static_cast, because you don't want to make a copy of the
Heap object, but to just store a pointer to it.
The two delete operators must be adjusted accordingly:
void operator delete (Heap& h, void* ptr)
{
void* realptr = static_cast<char*>(ptr) - HeaderSize;
Head* heap = *static_cast<Heap**>(realptr);
heap->free(realptr);
}
Regards,
Ganesh
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]