fork download
  1. #include <cstdlib>
  2. #include <cstdio>
  3. #include <exception>
  4.  
  5.  
  6. void* operator new(std::size_t n)
  7. {
  8. std::puts("usual new");
  9. void* p = std::malloc(n);
  10. return p ? p : throw std::exception();
  11. }
  12. void operator delete(void* p)
  13. {
  14. std::puts("usual delete");
  15. std::free(p);
  16. }
  17.  
  18. void* operator new(std::size_t n, std::size_t)
  19. {
  20. std::puts("placement new");
  21. void* p = std::malloc(n);
  22. return p ? p : throw std::exception();
  23. }
  24. void operator delete(void* p, std::size_t)
  25. {
  26. std::puts("placement delete");
  27. std::free(p);
  28. }
  29.  
  30. struct throwable_t {} throwable;
  31. struct sth
  32. {
  33. sth() = default;
  34. sth(const throwable_t&) { throw std::exception(); }
  35. };
  36.  
  37. int main()
  38. {
  39. std::puts("usual new/delete");
  40. sth* p = new sth();
  41. delete p;
  42.  
  43. try { p = new sth(throwable); }
  44. catch (...) {}
  45.  
  46. std::puts("placement new/delete");
  47. p = new (123) sth();
  48. p->~sth();
  49. operator delete(p, 123);
  50.  
  51. try { p = new(123) sth(throwable); }
  52. catch (...) {}
  53. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
usual new/delete
usual new
usual delete
usual new
usual delete
placement new/delete
placement new
placement delete
placement new
placement delete