Pergunta

Estou armazenando um objeto (TTF_Font) em um shared_ptr Isso me é fornecido a partir de uma API de terceiros. Não posso usar novo ou excluir no objeto, então o shared_ptr também recebe um functor "liberador".

// 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, mais tarde, precisar libertar explicitamente esse objeto, é correto fazer isso:

screenFont.reset();

E então vamos screenFont (o real shared_ptr objeto) ser destruído naturalmente?

Foi útil?

Solução

shared_ptr <> :: reset () soltará o refCount por um. Se isso resultar na queda da contagem para zero, o recurso apontado pelo shared_ptr <> será libertado.

Então, acho que a resposta para você é: sim, isso funcionará. Ou você pode simplesmente deixar a variável Screenfont ser destruída devido à queda do escopo ou o que quer que seja, se é isso que está prestes a acontecer.

Para ficar claro, o uso normal do Shared_Ptr <> é que você o deixa ser destruído naturalmente e lidará com o refco e liberando o recurso quando cair para zero naturalmente. RESET () é necessário apenas se você precisar liberar essa instância específica do recurso compartilhado antes que o shared_ptr <> fosse naturalmente destruído.

Outras dicas

Mike B respondeu sua pergunta, então vou comentar seu código. Se TTF_OpenFont não retorna nulo, ou se TTF_CloseFont pode lidar com nulas inofensivamente, você não precisa de um CloseFont aula, basta usar &TTF_CloseFont.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top