Domanda Come eliminare intenzionalmente un boost :: shared_ptr?


ne ho molti boost::shared_ptr<MyClass> oggetti, e ad un certo punto lo voglio intenzionalmente delete alcuni di loro per liberare un po 'di memoria. (So ​​a quel punto che non avrò mai bisogno del puntatore MyClass oggetti più.) Come posso farlo?

Immagino che non puoi semplicemente chiamare delete() con il puntatore crudo che ottengo get().

Ho visto una funzione get_deleter(shared_ptr<T> const & p) in boost::shared_ptr, ma non sono sicuro di come usarlo, e anche dice sperimentale proprio accanto ad esso. (Penso di avere Boost 1.38.)

Forse basta assegnare un nuovo vuoto boost::shared_ptr alla variabile? Questo dovrebbe eliminare il vecchio valore ed eliminarlo.


44
2018-03-07 03:15


origine


risposte:


Lo fai e basta

ptr.reset();

Vedere il manuale shared_ptr. È equivalente a

shared_ptr<T>().swap(ptr)

Chiami reset su ogni puntatore intelligente che non dovrebbe più fare riferimento all'oggetto. L'ultimo tale reset (o qualsiasi altra azione che fa cadere a zero il conteggio dei riferimenti, in realtà) farà sì che l'oggetto venga liberato usando automaticamente il deletatore.

Forse ti interessa il Tecniche di programmazione di puntatori intelligenti. Ha una voce su deallocazione ritardata.


81
2018-03-07 03:51



Se vuoi essere in grado di eliminare intenzionalmente gli oggetti (lo faccio sempre), devi utilizzare la proprietà singola. Sei stato indotto ad usare shared_ptr quando non è appropriato per il tuo progetto.


9
2017-08-07 08:49



L'intero punto di boost::shared_ptr<T> è che l'oggetto punta sarà cancellato Esattamente nel momento in cui no shared_ptr<T>s punto a questo - cioè, quando l'ultimo shared_ptr<T> puntare a questo oggetto esce dall'ambito o viene riassegnato per puntare a un oggetto diverso. Quindi, tutto quello che devi fare per eliminare un oggetto è assicurarti che non ci siano shared_ptr<T>s indicandolo. Per esempio. se ne hai solo uno shared_ptr<T> chiamato p puntando su un oggetto, o lasciandolo al di fuori del campo di applicazione, o chiamata p.reset() (equivalente a p = NULL per un puntatore semplice), o assegnarlo per indicare qualcos'altro.

Se ne hai due shared_ptr<T>s indicando l'oggetto, dovrai riassegnare entrambi.

MODIFICARE: Grazie a dehmann per averlo sottolineato p = NULL; non è in realtà un codice valido per a shared_ptr<T>... :)


8
2018-03-07 03:55



Quello che vuoi fare è restituire riferimenti deboli usando boost :: weak_ptr che può essere convertito in shared_ptr quando necessario. Questo può consentire di controllare la durata dell'oggetto in shared_ptr e quelli che vogliono accedervi possono rimanere su weak_ptr e provare a convertire in shared_ptr. Se quella conversione fallisce, allora possono ri-interrogare e riportare l'oggetto in memoria.


4
2018-04-18 03:48