Attualmente mi sto occupando di C++ per la codifica di livello inferiore con opengl. Vengo da uno sfondo pesante objc quindi ho un po 'di comprensione sulla gestione della memoria, ma non riesco a capire come la libreria "boost" gestisce i tipi di container come ptr_vector
.In che modo ptr_vector gestisce la memoria?
Penso che il mio problema sia legato al fatto che non ho idea di come ptr_vector
gestisca la distruzione di se stesso e dei suoi oggetti.
prega di dare un'occhiata al seguente codice:
// Header file
...
ptr_vector<IObject3D> objects;
...
// Implementation file
...
void ApplicationEngine::init()
{
WavefrontObject3D *object = new WavefrontObject3D("Ninja.obj");
objects.push_back(object);
}
...
Così, per la realtà in discussione: sto creando una perdita di qui, attraverso la variabile "oggetto"?
Sono abituato a trattenere e rilasciare i miei oggetti manualmente con le chiamate esplicite a objc: in precedenza ho dovuto alloc init
il WavefrontObject3D object
, inserirlo in un array e poi release
che lo stesso oggetto per evitare perdite.
Tuttavia, quando aggiungo uno delete object
dopo il push_back
, viene chiamato il decostruttore di WavefrontObject3D object
. Questo mi dà un suggerimento che il ptr_vector
non mantiene la variabile object
. La mia ipotesi è corretta?
aggiuntive, ma correlata, domanda: diciamo che voglio distruggere la classe contenente ApplicationEngine
non devo chiamare un qualche tipo di decostruttore sul ptr_vector
o gli elementi che gestisce?
'Ma quando aggiungo un oggetto delete dopo la chiamata push_back viene chiamato il decostruttore dell'oggetto WavefrontObject3D. Questo è il motivo per cui' delete' è fatto. Chiama il distruttore sull'istanza a cui punta il puntatore. – Nobody
Penso che dovresti leggere [RAII] (http://stackoverflow.com/q/395123/20984), che è il modo in cui viene gestita la maggior parte della gestione della memoria nel cosiddetto C++ "moderno". –
Grande risorsa @LucTouraille! Esattamente il modo in cui volevo avvicinarmi al C++. – polyclick