fork(2) download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class A
  5. {
  6. public:
  7. virtual ~A()
  8. {
  9. cout << "~A()" << endl;
  10. }
  11.  
  12. void* operator new (std::size_t size)
  13. {
  14. cout << "void* operator new (std::size_t size)" << endl;
  15. return ::operator new(size);
  16. }
  17.  
  18. // placement new
  19. void* operator new (std::size_t size, void* ptr) noexcept
  20. {
  21. cout << "void* operator new (std::size_t size, void* ptr) noexcept" << endl;
  22. return ::operator new(size, ptr);
  23. }
  24.  
  25. void operator delete (void* ptr, std::size_t size) noexcept
  26. {
  27. // От куда компиль взял размер класса B?
  28. cout << "delete (void* ptr, std::size_t size); size = " << size << "!!!" << endl;
  29. ::operator delete(ptr);
  30. }
  31.  
  32. void operator delete (void* ptr, void* voidptr2) noexcept
  33. {
  34. cout << "void operator delete (void* ptr, void* voidptr2) noexcept" << endl;
  35. ::operator delete(ptr, voidptr2);
  36. }
  37.  
  38. void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept = delete;
  39. void* operator new[] (std::size_t size) = delete;
  40. void* operator new[] (std::size_t size, const std::nothrow_t& nothrow_value) noexcept = delete;
  41. void* operator new[] (std::size_t size, void* ptr) noexcept = delete;
  42.  
  43. void operator delete (void* ptr, const std::nothrow_t& nothrow_constant) noexcept = delete;
  44. void operator delete[] (void* ptr) noexcept = delete;
  45. void operator delete[] (void* ptr, const std::nothrow_t& nothrow_constant) noexcept;
  46. void operator delete[] (void* ptr, void* voidptr2) noexcept = delete;
  47.  
  48. private:
  49. int _i1;
  50. };
  51.  
  52. class B : public A
  53. {
  54. public:
  55. virtual ~B()
  56. {
  57. cout << "~B()" << endl;
  58. }
  59.  
  60. private:
  61. int _i2;
  62. int _i3;
  63. };
  64.  
  65. int main() {
  66. cout << "sizeof(A) = " << sizeof(A) << endl;
  67. cout << "sizeof(B) = " << sizeof(B) << endl << endl;
  68.  
  69. B* b = new B();
  70. delete (A*)b; // call sized deallocation function
  71.  
  72. B* b2 = reinterpret_cast<B*>(::operator new(sizeof(B)));
  73. new(b2) B();
  74. delete (A*)b2; // call sized deallocation function
  75.  
  76. return 0;
  77. }
  78.  
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
sizeof(A) = 16
sizeof(B) = 24

void* operator new (std::size_t size)
~B()
~A()
delete (void* ptr, std::size_t size); size = 24!!!
void* operator new (std::size_t size, void* ptr) noexcept
~B()
~A()
delete (void* ptr, std::size_t size); size = 24!!!