Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <assert.h>
- static unsigned int objsAllocated = 0;
- class A
- {
- public:
- A()
- {
- std::cout << "Creado A" << std::endl;
- ++objsAllocated;
- }
- virtual ~A()
- {
- std::cout << "Liberado A" << std::endl;
- --objsAllocated;
- }
- };
- class B : public A
- {
- public:
- B()
- {
- std::cout << "Creado B" << std::endl;
- ++objsAllocated;
- }
- virtual ~B()
- {
- std::cout << "Liberado B" << std::endl;
- --objsAllocated;
- }
- };
- struct Message
- {
- ~Message()
- {
- std::cout << "Liberado (Fin del contexto en pila) mensaje" << std::endl;
- delete data;
- }
- void* data;
- };
- template <typename T>
- struct MessageTemplate
- {
- ~MessageTemplate()
- {
- std::cout << "Liberado (Fin del contexto en pila) mensaje" << std::endl;
- delete data;
- }
- T* data;
- };
- int main()
- {
- {
- #if 0
- // Salta el assert
- {
- Message m;
- m.data = (void*)new B();
- }
- #endif
- #if 1
- // Salta el assert
- // Solo si los destructores no son virtuales
- // Si los destructores son virtuales funciona perfectamente
- {
- MessageTemplate<A> m;
- m.data = new B();
- }
- #endif
- #if 1
- // Libera todo siempre
- // funciona aunque los destructores no sean virtuales
- {
- MessageTemplate<B> m;
- m.data = new B();
- }
- #endif
- }
- assert(objsAllocated == 0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement