#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 delete1");
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("usual delete2");
std::free(p);
}
constexpr 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+CgoKdm9pZCogb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90IG4pCnsKICBzdGQ6OnB1dHMoInVzdWFsIG5ldyIpOwogIHZvaWQqIHAgPSBzdGQ6Om1hbGxvYyhuKTsKICByZXR1cm4gcCA/IHAgOiB0aHJvdyBzdGQ6OmV4Y2VwdGlvbigpOwp9CnZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIHApCnsKICBzdGQ6OnB1dHMoInVzdWFsIGRlbGV0ZTEiKTsKICBzdGQ6OmZyZWUocCk7Cn0KCnZvaWQqIG9wZXJhdG9yIG5ldyhzdGQ6OnNpemVfdCBuLCBzdGQ6OnNpemVfdCkKewogIHN0ZDo6cHV0cygicGxhY2VtZW50IG5ldyIpOwogIHZvaWQqIHAgPSBzdGQ6Om1hbGxvYyhuKTsKICByZXR1cm4gcCA/IHAgOiB0aHJvdyBzdGQ6OmV4Y2VwdGlvbigpOwp9CnZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIHAsIHN0ZDo6c2l6ZV90KQp7CiAgc3RkOjpwdXRzKCJ1c3VhbCBkZWxldGUyIik7CiAgc3RkOjpmcmVlKHApOwp9Cgpjb25zdGV4cHIgc3RydWN0IHRocm93YWJsZV90IHt9IHRocm93YWJsZTsKc3RydWN0IHN0aAp7CiAgc3RoKCkgPSBkZWZhdWx0OwogIHN0aChjb25zdCB0aHJvd2FibGVfdCYpIHsgdGhyb3cgc3RkOjpleGNlcHRpb24oKTsgfQp9OwoKaW50IG1haW4oKQp7CiAgc3RkOjpwdXRzKCJ1c3VhbCBuZXcvZGVsZXRlIik7CiAgc3RoKiBwID0gbmV3IHN0aCgpOwogIGRlbGV0ZSBwOwogCiAgdHJ5IHsgcCA9IG5ldyBzdGgodGhyb3dhYmxlKTsgfQogIGNhdGNoICguLi4pIHt9CiAKICBzdGQ6OnB1dHMoInBsYWNlbWVudCBuZXcvZGVsZXRlIik7CiAgcCA9IG5ldyAoMTIzKSBzdGgoKTsKICBwLT5+c3RoKCk7CiAgb3BlcmF0b3IgZGVsZXRlKHAsIDEyMyk7CiAKICB0cnkgeyBwID0gbmV3KDEyMykgc3RoKHRocm93YWJsZSk7IH0KICBjYXRjaCAoLi4uKSB7fQp9