2011-08-17 14 views
8

Estaba leyendo el siguiente ejemplo MSKB y realizan una eliminación en un objeto administrado.¿Cuándo se debe llamar a delete en un objeto asignado gcnew?

Tenía la impresión de que nunca deberías eliminar un objeto recogido como basura sino que debes dejarlo en el recolector de basura.

¿Qué me he perdido?

Método 4

//#include <msclr/marshal.h> 
//using namespace msclr::interop; 
marshal_context^context = gcnew marshal_context(); 
const char* str4 = context->marshal_as<const char*>(str); 
puts(str4); 
delete context; 

Respuesta

11

delete en C++/CLI simplemente llama al método Dispose en un objeto gestionado, si se implementa la interfaz – System::IDisposable si no lo hace, es efectivamente un NOOP. De hecho, si intenta llamar al método Dispose en un objeto administrado usted mismo, obtendrá un error de compilación – delete es la expresión forzada para deshacerse de un objeto.

Para ser claros, no tiene nada que ver con la administración de la memoria, ya que la mayoría de los objetos finalizables recibirán GCed antes si están dispuestos.

+0

Entonces, aparte de marcar el objeto para un GC más inmediato, ¿realmente no hay una buena razón para usar eliminar en el ejemplo anterior? – TownCube

+2

@Cube: No, cumplir con su parte del contrato 'IDisposable' es una excelente razón para ** siempre ** usar' borrar' cuando haya terminado con un objeto. O mejor aún, use la semántica de la pila para la RAII simulada para que nunca tenga que usar 'delete', y' Dispose' se invocará automáticamente tan pronto como los objetos salgan del alcance. – ildjarn

Cuestiones relacionadas