Re: why isn't there a placement delete syntax
andrew_nuss@yahoo.com ha scritto:
struct Object {
static void* operator new (Heap&, size_t);
static void operator delete (Heap&, void*);
};
class MyObj : public Object {
...
};
main {
Heap heap;
MyObj* p = new (heap) MyObj(); // works!
delete (heap) p; // illlegal!
}
Can anyone explain how to delete these objects. I.e. why doesn't the
obvious analagous invocation of delete work using placement syntax.
I believe a placement delete syntax has not been provided because it
could be too error-prone. It would be too easy to make the mistake of
invoking delete with a parameter value different from that used for new.
What do I do?
Placement new is expected to store the additional info somewhere, in
particular in a place where operator delete can obtain it using the only
information it has, i.e.: the pointer. The most obvious way is to store
the info in block itself, as in (alignment issues omitted for brevity):
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;
}
// placement delete used only when the constructor throws
void operator delete (Heap& h, void* ptr)
{
Heap* hptr = static_cast<Heap*>(ptr);
h.free(hptr - 1);
}
// regular delete, not placement!
void operator delete (void* ptr)
{
Heap* hptr = static_cast<Heap*>(ptr);
hptr[-1]->free(hptr - 1); // retrieve info from the block
}
You may have other ways to determine the heap, for example you can keep
a map pointers/heap. A real life example is an embedded platform that
has two different kind of memory, for example a "fast" and a "slow"
memory. The placement new syntax could be used to let the user select
which kind of memory to allocate from. If the address ranges of the two
kind of memories do not overlap, the delete operator can quickly
determine which kind of memory to deallocate from by just looking at the
address.
If you start feeling discomfort about the placement syntax, it's
perfectly normal. It will pass. ;-)
Regards,
Ganesh
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]