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?

È stato utile?

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.

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