2008-10-01 10 views
7

Estoy almacenando un objeto (TTF_Font) en un shared_ptr que me es provisto desde una API de un tercero. No puedo usar new o delete en el objeto, por lo que el shared_ptr también se proporciona como un functor de "liberación".Usando .reset() para liberar un impulso :: shared_ptr con propiedad única

// 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 tarde, necesito liberar explícitamente este objeto es lo correcto para hacer esto:

screenFont.reset(); 

y luego dejar que screenFont (shared_ptr el objeto real) serán destruidos de forma natural?

Respuesta

16

shared_ptr <> :: reset() soltará el recuento por uno. Si eso hace que el recuento caiga a cero, se liberará el recurso apuntado por el shared_ptr <>.

Así que creo que la respuesta para usted es, sí, eso funcionará. O simplemente puede dejar que la variable ScreenFont se destruya debido a que se sale del alcance o lo que sea, si eso es lo que está por suceder.

Para ser claros, el uso normal de shared_ptr <> es que dejas que se destruya de forma natural, y se ocupará 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 que shared_ptr <> sea destruido de forma natural.

+1

Gracias por la respuesta. En mi caso, tengo que liberarlo explícitamente antes de otro recurso, y esta fue la única forma que encontré para hacer eso. –

+2

Solo para que quede claro: restablecer() no liberará el recurso retenido a menos que resulte en que el recuento vuelva a cero, no fuerza el recuento a cero. –

0

Mike B's respondió su pregunta, así que solo comentaré su código. Si TTF_OpenFont no devuelve nulo, o si TTF_CloseFont puede manejar nulos inofensivamente, no necesita una clase CloseFont, solo use &TTF_CloseFont.

+0

Gracias. Eso es lo que estaba haciendo inicialmente. Encontré un error relacionado con otro recurso liberado antes de mi recurso de fuente e intenté resolverlo por el método anterior. Aunque el error no estaba relacionado con el functor, lo guardé porque estoy manejando otros recursos con el mismo patrón. –

Cuestiones relacionadas