Использование .reset() для освобождения boost::shared_ptr с единоличным владением
-
03-07-2019 - |
Вопрос
Я сохраняю объект (TTF_Font
) в shared_ptr
который предоставляется мне из стороннего API.Я не могу использовать new или delete для объекта, поэтому shared_ptr
также предусмотрен «освобождающий» функтор.
// 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() );
Если позже мне понадобится явно освободить этот объект, правильно ли это сделать:
screenFont.reset();
И тогда пусть screenFont
(Настоящий shared_ptr
объект) быть уничтожен естественным путем?
Решение
Shared_ptr<>::reset() уменьшит количество ссылок на единицу.Если это приведет к падению счетчика до нуля, ресурс, на который указывает Shared_ptr<>, будет освобожден.
Поэтому я думаю, что ответ для вас: да, это сработает.Или вы можете просто позволить переменной screenFont быть уничтожена из-за выхода из области видимости или чего-то еще, если это вот-вот произойдет.
Чтобы внести ясность, обычное использование Shared_ptr<> заключается в том, что вы позволяете ему уничтожиться естественным путем, и он будет иметь дело со счетчиком ссылок и освобождением ресурса, когда он естественным образом упадет до нуля.Функция сброса() требуется только в том случае, если вам необходимо освободить этот конкретный экземпляр общего ресурса до того, как общий_ptr<> будет естественным образом уничтожен.
Другие советы
Майк Б. ответил на ваш вопрос, поэтому я просто прокомментирую ваш код.Если TTF_OpenFont
не возвращает ноль, или если TTF_CloseFont
может безвредно обрабатывать нули, вам не нужен CloseFont
класс вообще, просто используйте &TTF_CloseFont
.