Domanda

Ho molti boost::shared_ptr<MyClass> gli oggetti, e a un certo punto ho volutamente desidera delete alcuni di loro per liberare la memoria.(So che non avrò mai bisogno la punta di MyClass gli oggetti più.) Come posso fare?

Credo che non si può semplicemente chiamare delete() con il puntatore raw che ho con get().

Ho visto una funzione get_deleter(shared_ptr<T> const & p) in boost::shared_ptr, ma non so come usarlo, e anche si dice sperimentale accanto ad essa.(Credo di avere un Boost 1.38.)

Forse solo assegnare un nuovo vuoto boost::shared_ptr per il variabile?Che dovrebbe buttare via il vecchio valore e di eliminarlo.

È stato utile?

Soluzione

Basta fare

ptr.reset();

Vedere la shared_ptr manuale.È equivalente a

shared_ptr<T>().swap(ptr)

Si chiama reset ogni puntatore intelligente che non deve fare riferimento l'oggetto più.L'ultimo reset (o qualsiasi altra azione che provoca il conteggio di riferimento goccia a zero, in realtà) sarà l'oggetto di connessione autenticata utilizzando il deleter automaticamente.

Forse si sono interessati al Smart Pointer Tecniche Di Programmazione.Esso si compone di un ingresso su in ritardo di deallocazione.

Altri suggerimenti

Se si vuole essere in grado intenzionalmente eliminare gli oggetti (io lo faccio tutto il tempo), allora si utilizza un unico proprietario.Sei stato attirato in uso shared_ptr quando non è appropriato per il vostro disegno.

Il punto di boost::shared_ptr<T> è che il pointee oggetto verrà eliminato esattamente al momento non shared_ptr<T>s punto a, ovvero, quando l'ultimo shared_ptr<T> indicando questo oggetto va fuori portata o viene riassegnato a punto di un oggetto diverso.Così, tutto quello che dovete fare per eliminare un oggetto è assicurarsi che non ci sono shared_ptr<T>s che punta a esso.E. g.se si dispone solo di un singolo shared_ptr<T> chiamato p che punta a un oggetto, lasciatelo cadere al di fuori del campo di applicazione, o chiamare p.reset() (equivalente a p = NULL per un normale puntatore), o assegnare per puntare a qualcosa d'altro.

Se si dispone di due shared_ptr<T>s indicando l'oggetto, è necessario riassegnare entrambi.

EDIT: Grazie per dehmann per precisare che p = NULL; in realtà non è un codice valido per un shared_ptr<T>... :)

Che cosa si vuole fare è tornare riferimenti deboli utilizzando boost::weak_ptr che può essere convertito in un shared_ptr quando necessario.In questo modo è possibile controllare la durata dell'oggetto in shared_ptr e coloro che vogliono di accesso può tenere su il weak_ptr e tenta di convertire un shared_ptr.Se la conversione non riesce, allora si può ri-query e portare l'oggetto in memoria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top