Why C++ hasn't placement delete that directly corresponds to the placement new, i.e. calls the destructor and calls appropriate placement delete operator?
For example:
MyType *p = new(arena) MyType;
...
//current technique
p->~MyType();
operator delete(p, arena);
//proposed technique
delete(arena) p;
operator delete
is unique in being a non-member or static member function that is dynamically dispatched. A type with a virtual destructor performs the call to its own delete
from the most derived destructor.
struct abc {
virtual ~abc() = 0;
};
struct d : abc {
operator delete() { std::cout << "goodbye\n"; }
};
int main() {
abc *p = new d;
delete p;
}
For this to work with placement delete, the destructor would have to somehow pass the additional arguments to operator delete
.
operator delete
overload with different arguments.operator delete
should be called. But if the destructor does lookup, this hits the same problem of requiring multiple virtual function definitions as #1. Some kind of abstract overload set would have to be created, which the caller would resolve.You have a perfectly good point, and it would be a nice addition to the language. Retrofitting it into the existing semantics of delete
is probably even possible, in theory. But most of the time we don't use the full functionality of delete
and it suffices to use a pseudo-destructor call followed by something like arena.release(p)
.