2011-08-17 14 views
8

Stavo leggendo il seguente esempio MSKB e loro eseguono un'eliminazione su un oggetto gestito.Quando dovrebbe essere richiamato su un oggetto assegnato a gcnew?

Ho avuto l'impressione che non dovresti mai eliminare un oggetto raccolto con garmenta piuttosto che devi lasciarlo al garbage collector.

Cosa mi è mancato?

Metodo 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; 

risposta

11

delete in C++/CLI semplicemente chiama il metodo Dispose su un oggetto gestito, se implementa l'interfaccia System::IDisposable – caso contrario, è efficace un noop. Infatti, se provi a chiamare da solo il metodo Dispose su un oggetto gestito, riceverai un errore del compilatore – delete è l'idioma forzato per lo smaltimento di un oggetto.

Per essere chiari, non ha nulla a che fare con la gestione della memoria, notando ovviamente che gli oggetti più finalizzabili otterranno GCed prima se sono disposti.

+0

Quindi, dopo aver contrassegnato l'oggetto per un GC più immediato, non c'è davvero alcun valido motivo per utilizzare l'eliminazione nell'esempio precedente? – TownCube

+2

@Cube: No, la fine del contratto 'IDisposable' è un ottimo motivo per ** sempre ** usare' delete' ogni volta che hai finito con un oggetto. O meglio ancora, usa la semantica dello stack per RAII simulato in modo da non dover mai usare 'delete', e' Dispose' verrà chiamato automaticamente non appena gli oggetti escono dall'ambito. – ildjarn

Problemi correlati