2011-01-25 16 views
6

Tengo una clase en la que estoy sobrecargando nueva y eliminándola (estas recuperan y devuelven la memoria desde y hacia un grupo de memoria). Lo que me frustra es que la clase sobre la que he sobrecargado todavía tiene su destructor llamado antes de que se llame a la función borrar sobrecargado. ¿Cómo puedo detener esto?Stopping destructor se llama

class Message 
{ 
    ~Message() { ... } 

    void* operator new(std::size_t sz) { ... } 
    void operator delete(void* ptr) { ... } 
}; 

EDIT:

Am cierto al pensar que los miembros de la clase serán destruidos, pero la memoria no serán liberados por los destructores; la función de eliminación posee esta responsabilidad, en cuyo caso puedo evitar que la memoria sea desasignada?

RESULTADO: Penny dejó de lado que la asignación/desasignación de memoria y construcción/destrucción son elementos separados. Ahora tengo destructores vacíos y sobrecargado nuevo/eliminar.

+2

No sé por qué eso es frustrante; C++ es muy lógico en este sentido. Deje un destructor vacío si no lo necesita para hacer nada. –

Respuesta

6

La destrucción y la desasignación son dos cosas ortogonales, una no debería inhibir la otra. ¿Qué harías con las instancias de tu clase que se crearon en la pila? No limpiar sus recursos? Está tratando de romper un concepto muy útil de RAII.

4

No creo que pueda evitar que se llame al destructor, y no estoy seguro de por qué lo desea. El objeto debe destruirse antes de liberar la memoria: si la superclase asignó algunos recursos, su destructor debe liberarlos antes de que la memoria del objeto se libere.

Editar después de su edición: Sí, los destructores limpian todo lo que asignaron, pero no desasignan la memoria del objeto. El método delete que está escribiendo lo hace.

BTW, buen nombre. :-)

3

Si usted está preocupado (a) agarrar la memoria de un grupo específico y (b) el control cuando los destructores se llaman una opción es placement new:

void* raw = allocate(sizeof(Foo)); // line 1 
Foo* p = new(raw) Foo();   // line 2 

p->~Foo(); // explicitely call destructor 

(código tomada desde arriba enlace a C++ FAQ)

0

Respondiendo a su pregunta, sí se llaman constructores y destructores, ya sea que sobrecargue nuevo/elimine o no.

Respondiendo a una pregunta que no hizo, si es una buena solución para usar los objetos con grupo de memoria, la respuesta es generalmente: "no". Lo que quiere son sus clases, trabajando con grupo de memoria para tomar una clase de asignador. Permite mucha más flexibilidad y, por lo general, no solo tiene una clase, sino muchas que se colocarán en el grupo de memoria, por lo que no desea tener una sobrecarga masiva de todas las funciones nuevas/eliminar. Además, no es inusual tener varios esquemas de asignación (y por lo tanto asignadores), pero puede sobrecargar nueva/eliminar solo una vez.

+0

Respondiendo a su pregunta: ¿cómo evitar llamar a un destructor en C++? Esto solo se puede hacer si va a utilizar la ubicación nueva para la asignación, en cuyo caso, usted (como programador) debe asumir la responsabilidad de llamar al destructor manualmente (como Doug dijo: p-> ~ Foo :: Foo() ;). Esa es la única instancia en el lenguaje cuando un programador TIENE que llamar al destructor manualmente. – Viren

Cuestiones relacionadas