#include <iostream>
class Foo {
public:
Foo()
{
throw std::runtime_error("Oops!");
}
};
struct Arena {
bool touched = false;
};
void* operator new(std::size_t, Arena& arena)
{
std::cout << "new has called.\n";
return ::operator new(sizeof(Foo));
}
void operator delete(void*, Arena& arena)
{
std::cout << "delete has called.\n";
arena.touched = true;
}
int main(int argc, char** argv)
{
Arena arena;
try {
new(arena) Foo;
}
catch(...) {
std::cout << "exception was thrown.\n";
}
// This differs for different type of builds.
std::cout << std::boolalpha << "arena.touched == " << arena.touched << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgpjbGFzcyBGb28gewpwdWJsaWM6CiAgICBGb28oKQogICAgewogICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiT29wcyEiKTsKICAgIH0KfTsKc3RydWN0IEFyZW5hIHsKICAgIGJvb2wgdG91Y2hlZCA9IGZhbHNlOwp9Owp2b2lkKiBvcGVyYXRvciBuZXcoc3RkOjpzaXplX3QsIEFyZW5hJiBhcmVuYSkKewogICAgc3RkOjpjb3V0IDw8ICJuZXcgaGFzIGNhbGxlZC5cbiI7CiAgICByZXR1cm4gOjpvcGVyYXRvciBuZXcoc2l6ZW9mKEZvbykpOwp9CnZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCBBcmVuYSYgYXJlbmEpCnsKICAgIHN0ZDo6Y291dCA8PCAiZGVsZXRlIGhhcyBjYWxsZWQuXG4iOwogICAgYXJlbmEudG91Y2hlZCA9IHRydWU7Cn0KaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQp7CiAgICBBcmVuYSBhcmVuYTsKICAgIHRyeSB7CiAgICAgICAgbmV3KGFyZW5hKSBGb287CiAgICB9CiAgICBjYXRjaCguLi4pIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImV4Y2VwdGlvbiB3YXMgdGhyb3duLlxuIjsKICAgIH0KICAgIC8vIFRoaXMgZGlmZmVycyBmb3IgZGlmZmVyZW50IHR5cGUgb2YgYnVpbGRzLgogICAgc3RkOjpjb3V0IDw8IHN0ZDo6Ym9vbGFscGhhIDw8ICJhcmVuYS50b3VjaGVkID09ICIgPDwgYXJlbmEudG91Y2hlZCA8PCAnXG4nOwogICAgcmV0dXJuIDA7Cn0K