fork download
  1. #include <iostream>
  2. #include <cstddef>
  3.  
  4. class Base_no_virt_dtor {
  5. int a[10];
  6. };
  7.  
  8. class Derived_no_virt_dtor : public Base_no_virt_dtor {
  9. int b[10];
  10. };
  11.  
  12. class Base_virt_dtor {
  13. int c[10];
  14. public:
  15. virtual ~Base_virt_dtor() = default;
  16. };
  17.  
  18. class Derived_virt_dtor : public Base_virt_dtor {
  19. int d[10];
  20. };
  21.  
  22. // replaceable usual deallocation functions
  23. // (since C++14)
  24. void operator delete ( void* ptr, std::size_t sz ) noexcept{
  25. std::cout << "delete (ptr=" << ptr << ", sz=" << sz << ");\n";
  26. }
  27.  
  28. int main(void) {
  29. std::cout << "sizeof(Base_no_virt_dtor) = " << sizeof(Base_no_virt_dtor) << ";\n";
  30. std::cout << "sizeof(Derived_no_virt_dtor) = " << sizeof(Derived_no_virt_dtor) << ";\n";
  31. std::cout << "sizeof(Base_virt_dtor) = " << sizeof(Base_virt_dtor) << ";\n";
  32. std::cout << "sizeof(Derived_virt_dtor) = " << sizeof(Derived_virt_dtor) << ";\n";
  33.  
  34. std::cout << std::endl;
  35.  
  36. {
  37. Base_no_virt_dtor* baseptr_no_virt_dtor = new Derived_no_virt_dtor;
  38. std::cout << "baseptr_no_virt_dtor = " << baseptr_no_virt_dtor << ";\n";
  39. delete baseptr_no_virt_dtor;
  40. }
  41.  
  42. std::cout << std::endl;
  43.  
  44. {
  45. Base_virt_dtor* baseptr_virt_dtor = new Derived_virt_dtor;
  46. std::cout << "baseptr_virt_dtor = " << baseptr_virt_dtor << ";\n";
  47. delete baseptr_virt_dtor;
  48. }
  49. return 0;
  50. }
Success #stdin #stdout 0s 4308KB
stdin
Standard input is empty
stdout
sizeof(Base_no_virt_dtor) = 40;
sizeof(Derived_no_virt_dtor) = 80;
sizeof(Base_virt_dtor) = 48;
sizeof(Derived_virt_dtor) = 88;

baseptr_no_virt_dtor = 0x55d142b45e80;
delete (ptr=0x55d142b45e80, sz=40);

baseptr_virt_dtor = 0x55d142b45ee0;
delete (ptr=0x55d142b45ee0, sz=88);