Usando .reset () para liberar un impulso :: shared_ptr con propiedad exclusiva
-
03-07-2019 - |
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?
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
.