Sono estremamente confuso riguardo la gestione delle risorse in C++/CLI. Pensavo di avere un manico (nessun gioco di parole) su di esso, ma mi sono imbattuto nella classe auto_gcroot<T>
mentre guardavo attraverso i file di intestazione, che hanno portato a una ricerca su google, quindi la parte migliore della documentazione di lettura del giorno, e ora la confusione. Quindi ho pensato di rivolgermi alla comunità.Confusione gestione risorse C++/CLI
Le mie domande riguardano la differenza tra semantica auto_handle/stack e auto_gcroot/gcroot.
auto_handle: La mia comprensione è che questo pulirà un oggetto gestito creato in una funzione gestita. La mia confusione è che il garbage collector non dovrebbe farlo per noi? Non era questo il punto del codice gestito? Per essere più precisi:
//Everything that follows is managed code void WillThisLeak(void) { String ^str = gcnew String ^(); //Did I just leak memory? Or will GC clean this up? what if an exception is thrown? } void NotGoingToLeak(void) { String ^str = gcnew String^(); delete str; //Guaranteed not to leak, but is this necessary? } void AlsoNotGoingToLeak(void) { auto_handle<String ^> str = gcnew String^(); //Also Guaranteed not to leak, but is this necessary? } void DidntEvenKnowICouldDoThisUntilToday(void) { String str(); //Also Guaranteed not to leak, but is this necessary? }
Ora, questo avrebbe senso per me se fosse una sostituzione per il C# utilizzando parole chiave, ed è stato raccomandato solo per l'uso con i tipi ad alta intensità di risorse, come bitmap, ma questo non è menzionato da nessuna parte nella documentazione così im ive paura stato perdite di memoria per tutto questo tempo ora
auto_gcroot
Posso passarlo come argomento a una funzione nativa? Cosa succederà sulla copia?
void function(void)
{
auto_gcroot<Bitmap ^> bmp = //load bitmap from somewhere
manipulateBmp(bmp);
pictureBox.Image = bmp; //Is my Bitmap now disposed of by auto_gcroot?
}
#pragma unmanaged
void maipulateBmp(auto_gcroot<Bitmap ^> bmp)
{
//Do stuff to bmp
//destructor for bmp is now called right? does this call dispose?
}
Questo avrebbe funzionato se avessi usato un gcroot invece?
Inoltre, qual è il vantaggio di avere auto_handle e auto_gcroot? Sembra che facciano cose simili.
Devo essere frainteso qualcosa per cui questo non ha molto senso, quindi una buona spiegazione sarebbe grandiosa. Inoltre, qualsiasi consiglio riguardante l'uso corretto di questi tipi, i luoghi in cui posso andare a imparare queste cose e qualsiasi altra buona pratica/luogo in cui posso trovarli sarebbe molto apprezzato.
grazie mille, Max
non ho mai utilizzare la maggior parte delle forme qui: Io uso sempre i riferimenti per gli oggetti gestiti e ho sempre lasciato che il GC li ripulire per me. A volte uso 'gcroot', ma raramente (quando voglio ad esempio per avvolgere le chiusure/delegati .NET in oggetti funzione C++ e mantenere un handle per tutto il tempo necessario). –
È un tentativo abbastanza pesante di portare auto_ptr <> nel mondo gestito. Sciocco come la libreria STL/CLR. La cosa migliore da fare è dimenticarsene. –