Pregunta

Estoy almacenando un objeto (TTF_Font) en un shared_ptr que me proporciona una API de terceros. No puedo usar new o delete en el objeto, por lo que screenFont también se proporciona 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() );

Si, más adelante, necesito liberar explícitamente este objeto, ¿es correcto hacer esto?

screenFont.reset();

¿Y luego dejar que <=> (el objeto <=> real) sea destruido naturalmente?

¿Fue útil?

Solución

shared_ptr < > :: reset () reducirá el recuento en uno. Si eso hace que el recuento caiga a cero, el recurso señalado por shared_ptr & Lt; & Gt; será liberado.

Entonces creo que la respuesta para usted es sí, eso funcionará. O simplemente puede dejar que la variable screenFont se destruya debido a un abandono del alcance o lo que sea, si eso es lo que va a suceder.

Para ser claros, el uso normal de shared_ptr < > es que dejas que se destruya naturalmente, y se encargará del recuento y liberará el recurso cuando caiga a cero naturalmente. reset () solo es necesario si necesita liberar esa instancia particular del recurso compartido antes de shared_ptr < > sería naturalmente destruido.

Otros consejos

Mike B ha respondido tu pregunta, así que solo comentaré tu código. Si TTF_OpenFont no devuelve nulo, o si TTF_CloseFont puede manejar nulos inofensivamente, no necesita una clase CloseFont en absoluto, solo use &TTF_CloseFont.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top