#include <cstdlib>
#include <cstdio>
#include <exception>
void* operator new(std::size_t n)
{
std::puts("usual new");
void* p = std::malloc(n);
return p ? p : throw std::exception();
}
void operator delete(void* p)
{
std::puts("usual delete");
std::free(p);
}
void* operator new(std::size_t n, std::size_t)
{
std::puts("placement new");
void* p = std::malloc(n);
return p ? p : throw std::exception();
}
void operator delete(void* p, std::size_t)
{
std::puts("placement delete");
std::free(p);
}
struct throwable_t {} throwable;
struct sth
{
sth() = default;
sth(const throwable_t&) { throw std::exception(); }
};
int main()
{
std::puts("usual new/delete");
sth* p = new sth();
delete p;
try { p = new sth(throwable); }
catch (...) {}
std::puts("placement new/delete");
p = new (123) sth();
p->~sth();
operator delete(p, 123);
try { p = new(123) sth(throwable); }
catch (...) {}
}
I2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjc3RkaW8+CiNpbmNsdWRlIDxleGNlcHRpb24+CiAKIAp2b2lkKiBvcGVyYXRvciBuZXcoc3RkOjpzaXplX3QgbikKewogIHN0ZDo6cHV0cygidXN1YWwgbmV3Iik7CiAgdm9pZCogcCA9IHN0ZDo6bWFsbG9jKG4pOwogIHJldHVybiBwID8gcCA6IHRocm93IHN0ZDo6ZXhjZXB0aW9uKCk7Cn0Kdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCogcCkKewogIHN0ZDo6cHV0cygidXN1YWwgZGVsZXRlIik7CiAgc3RkOjpmcmVlKHApOwp9CiAKdm9pZCogb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90IG4sIHN0ZDo6c2l6ZV90KQp7CiAgc3RkOjpwdXRzKCJwbGFjZW1lbnQgbmV3Iik7CiAgdm9pZCogcCA9IHN0ZDo6bWFsbG9jKG4pOwogIHJldHVybiBwID8gcCA6IHRocm93IHN0ZDo6ZXhjZXB0aW9uKCk7Cn0Kdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCogcCwgc3RkOjpzaXplX3QpCnsKICBzdGQ6OnB1dHMoInBsYWNlbWVudCBkZWxldGUiKTsKICBzdGQ6OmZyZWUocCk7Cn0KIApzdHJ1Y3QgdGhyb3dhYmxlX3Qge30gdGhyb3dhYmxlOwpzdHJ1Y3Qgc3RoCnsKICBzdGgoKSA9IGRlZmF1bHQ7CiAgc3RoKGNvbnN0IHRocm93YWJsZV90JikgeyB0aHJvdyBzdGQ6OmV4Y2VwdGlvbigpOyB9Cn07CiAKaW50IG1haW4oKQp7CiAgc3RkOjpwdXRzKCJ1c3VhbCBuZXcvZGVsZXRlIik7CiAgc3RoKiBwID0gbmV3IHN0aCgpOwogIGRlbGV0ZSBwOwogCiAgdHJ5IHsgcCA9IG5ldyBzdGgodGhyb3dhYmxlKTsgfQogIGNhdGNoICguLi4pIHt9CiAKICBzdGQ6OnB1dHMoInBsYWNlbWVudCBuZXcvZGVsZXRlIik7CiAgcCA9IG5ldyAoMTIzKSBzdGgoKTsKICBwLT5+c3RoKCk7CiAgb3BlcmF0b3IgZGVsZXRlKHAsIDEyMyk7CiAKICB0cnkgeyBwID0gbmV3KDEyMykgc3RoKHRocm93YWJsZSk7IH0KICBjYXRjaCAoLi4uKSB7fQp9