Usando .reset () para libertar um impulso :: shared_ptr com a propriedade única
-
03-07-2019 - |
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?
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
.