2011-07-28 13 views
5

En mi proyecto, tengo una clase base abstracta "Base". Me gustaría rastrear todas las asignaciones/desasignaciones dinámicas de objetos que se derivan de "Base". Con este fin, he anulado los operadores nuevos/eliminar en "Base".Obtener el tipo más derivado durante la construcción del objeto

Después de asignar con éxito la memoria en el nuevo operador reemplazado, me gustaría notificar al objeto que estoy utilizando para la memoria de seguimiento que se ha producido una asignación, con el tipo más derivado de la asignación y su tamaño. El tamaño no es un problema (ya que se transfiere directamente al nuevo operador para "Base"), pero obtener el tipo más derivado es un problema.

Me inclino a pensar que esto no es posible en la forma en que trato de hacerlo. Como las partes más derivadas del objeto aún no se han construido, no hay forma de saber cuáles son. Sin embargo, el nuevo operador sobrecargado de la clase "Base" sabe algo sobre el producto final, el tamaño, entonces, ¿es posible saber algo más al respecto?

Para el contexto:

void* Base::operator new(size_t size) 
{ 
    void* storage = malloc(size); 

    if (storage == NULL) 
     throw std::bad_alloc(); 

    // Notify MemoryTracker an allocation has occurred 
    // MemoryTracker::Instance().Allocate(type, size); 

    return storage; 
} 
+3

+1 No creo que esto sea posible usando 'operator new', pero no puedo probarlo. Tengo curiosidad por ver si voy a demostrar que estoy equivocado una vez más sobre las características del lenguaje C++. :-) – templatetypedef

Respuesta

2

Tienes razón, no es posible de esta manera, como new operador simplemente asigna memoria, nada más. El lugar correcto para hacer tal cosa es constructor, no asignador, donde debería poder usar RTTI para determinar el tipo de objeto construido (y así se puede hacer en el constructor Base, no en cada constructor de clase secundaria).

+6

RTTI no debería funcionar completamente en el constructor de la clase base ya que funciona basado en el puntero vtable que se inicializa para apuntar al vtable de la clase base en ese punto. – unkulunkulu

+0

Parece que es cierto, ¿es posible conocer el tipo de objeto más derivado antes de que se haya construido por completo? – Wells

+0

@Wells: no, no lo es. Se llama a un constructor de clase base antes de un constructor derivado. –

2

Este es un truco que aprendí cuando estudiaba las implementaciones de GC para C++. Un inconveniente es que debe usar una macro en lugar de simple.

struct base { 
    void *operator new(size_t sz) { 
    // ... 
    } 
}; 

struct init_tag {}; 

base * operator % (init_tag, base *ptr) { 
    // just do what you like here... 
    return ptr; 
} 

#define gc_new init_tag() % new 
+0

Aterrador. Gracias. – Wells

Cuestiones relacionadas