makiolo

Unit Test - delete void*

Nov 20th, 2011
71
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <assert.h>
  3.  
  4. static unsigned int objsAllocated = 0;
  5.  
  6. class A
  7. {
  8. public:
  9.     A()
  10.     {
  11.         std::cout << "Creado A" << std::endl;
  12.        
  13.         ++objsAllocated;
  14.     }
  15.    
  16.     virtual ~A()
  17.     {
  18.         std::cout << "Liberado A" << std::endl;
  19.        
  20.         --objsAllocated;
  21.     }
  22. };
  23.  
  24. class B : public A
  25. {
  26. public:
  27.     B()
  28.     {
  29.         std::cout << "Creado B" << std::endl;
  30.        
  31.         ++objsAllocated;
  32.     }
  33.    
  34.     virtual ~B()
  35.     {
  36.         std::cout << "Liberado B" << std::endl;
  37.        
  38.         --objsAllocated;
  39.     }    
  40. };
  41.  
  42. struct Message
  43. {
  44.    
  45.     ~Message()
  46.     {
  47.         std::cout << "Liberado (Fin del contexto en pila) mensaje" << std::endl;
  48.         delete data;
  49.     }
  50.    
  51.     void* data;
  52. };
  53.  
  54. template <typename T>
  55. struct MessageTemplate
  56. {
  57.    
  58.     ~MessageTemplate()
  59.     {
  60.         std::cout << "Liberado (Fin del contexto en pila) mensaje" << std::endl;
  61.         delete data;
  62.     }
  63.    
  64.     T* data;
  65. };
  66.  
  67. int main()
  68. {
  69.     {
  70. #if 0
  71.         // Salta el assert
  72.         {
  73.         Message m;
  74.         m.data = (void*)new B();
  75.         }
  76. #endif
  77.  
  78. #if 1
  79.         // Salta el assert
  80.         // Solo si los destructores no son virtuales
  81.         // Si los destructores son virtuales funciona perfectamente
  82.         {
  83.         MessageTemplate<A> m;
  84.         m.data = new B();
  85.         }
  86. #endif
  87.  
  88. #if 1
  89.         // Libera todo siempre
  90.         // funciona aunque los destructores no sean virtuales
  91.         {
  92.         MessageTemplate<B> m;
  93.         m.data = new B();
  94.         }
  95. #endif
  96.     }
  97.    
  98.     assert(objsAllocated == 0);
  99.    
  100.     return 0;
  101. }
  102.  
  103.  
RAW Paste Data