fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4.  
  5. struct A{
  6. A(){cout<<"+A "<<this<<endl;}
  7. ~A(){cout<<"-A "<<this<<endl;}
  8. virtual void test(){}
  9. void ad(){
  10. cout<<*(void**)this<<" "<<endl;
  11. }
  12. };
  13. struct B:A{
  14. B(){cout<<"+B "<<this<<endl;}
  15. ~B(){cout<<"-B "<<this<<endl;}
  16. virtual void test(){}
  17. };
  18. void* operator new ( std::size_t count ){
  19. void* r=malloc(count);
  20. cout<<"new_1 "<<count<<" = "<<r<<endl;
  21. return r;
  22. }
  23. void operator delete (void* r){
  24. cout<<"delete_1 "<<" = "<<r<<endl;
  25. free(r);
  26. }
  27. void operator delete (void* r, std::size_t count ){
  28. cout<<"delete_2 "<<count<<" = "<<r<<endl;
  29. free(r);
  30. }
  31.  
  32. int main(){
  33. cout<<sizeof(A)<<" "<<sizeof(B)<<endl<<endl;
  34. {
  35. B* b=new B;
  36. A* a=b;
  37. a->A::ad();
  38. b->B::ad();
  39. delete a;//Удаляю как a
  40. }
  41. cout<<endl<<endl;
  42. {
  43. B* b=new B;
  44. A* a=b;
  45. a->A::ad();
  46. b->B::ad();
  47. delete b;//Удаляю как b
  48. }
  49. cout<<endl<<endl;
  50. {
  51. B* b=new B;
  52. A* a=b;
  53. void* v=b;
  54. a->A::ad();
  55. b->B::ad();
  56. delete v;//Удаляю как void*
  57. }
  58. }
  59.  
Success #stdin #stdout 0s 4416KB
stdin
Standard input is empty
stdout
8 8

new_1 8 = 0x55fcaa02ee80
+A 0x55fcaa02ee80
+B 0x55fcaa02ee80
0x55fca83ecd00 
0x55fca83ecd00 
-A 0x55fcaa02ee80
delete_2 8 = 0x55fcaa02ee80


new_1 8 = 0x55fcaa02ee80
+A 0x55fcaa02ee80
+B 0x55fcaa02ee80
0x55fca83ecd00 
0x55fca83ecd00 
-B 0x55fcaa02ee80
-A 0x55fcaa02ee80
delete_2 8 = 0x55fcaa02ee80


new_1 8 = 0x55fcaa02ee80
+A 0x55fcaa02ee80
+B 0x55fcaa02ee80
0x55fca83ecd00 
0x55fca83ecd00 
delete_1  = 0x55fcaa02ee80