Utilizzo di .reset () per liberare un boost :: shared_ptr di proprietà esclusiva
-
03-07-2019 - |
Domanda
Sto memorizzando un oggetto (TTF_Font
) in un shared_ptr
che mi viene fornito da un'API di terze parti. Non posso usare nuovo o cancellare sull'oggetto, quindi screenFont
è anche fornito un & Quot; liberando & Quot; functor.
// Functor
struct CloseFont
{
void operator()(TTF_Font* font) const
{
if(font != NULL) {
TTF_CloseFont(font);
}
}
};
boost::shared_ptr<TTF_Font> screenFont;
screenFont = boost::shared_ptr<TTF_Font>( TTF_OpenFont("slkscr.ttf", 8), CloseFont() );
Se, in seguito, devo liberare esplicitamente questo oggetto, è corretto farlo:
screenFont.reset();
E poi lasciare <=> (l'attuale <=> oggetto) essere distrutto naturalmente?
Soluzione
shared_ptr < > :: reset () eliminerà il refcount di uno. Se ciò porta il conteggio a zero, la risorsa indicata da shared_ptr & Lt; & Gt; sarà liberato.
Quindi penso che la risposta per te sia, sì, funzionerà. Oppure puoi semplicemente lasciare che la variabile screenFont venga distrutta a causa dell'abbandono dell'ambito o altro, se è quello che sta per accadere.
Per essere chiari, l'uso normale di shared_ptr < > è che lasci che venga distrutto naturalmente, e si occuperà del conteggio e liberando la risorsa quando scende a zero naturalmente. reset () è richiesto solo se è necessario rilasciare quella particolare istanza della risorsa condivisa prima di shared_ptr < > sarebbe naturalmente distrutto.
Altri suggerimenti
Mike B ha risposto alla tua domanda, quindi commenterò il tuo codice. Se TTF_OpenFont
non restituisce null, o se TTF_CloseFont
è in grado di gestire i null in modo innocuo, non è necessaria una classe CloseFont
, basta usare &TTF_CloseFont
.