Я храню объект (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 <> заключается в том, что вы позволяете ему разрушаться естественным образом, и он будет иметь дело с refcount и освобождением ресурса, когда он естественным образом упадет до нуля. reset () требуется только в том случае, если вам нужно освободить этот конкретный экземпляр общего ресурса до того, как shared_ptr <> будет разрушен естественным образом.
Чтобы быть ясным - reset () не освободит удерживаемый ресурс, если это не приведет к уменьшению счетчика ссылок до нуля - он не приводит к принудительному сбросу счетчика ссылок в ноль.
Майк Б. ответил на ваш вопрос, поэтому я просто прокомментирую ваш код. Если TTF_OpenFont не возвращает null или если TTF_CloseFont может безвредно обрабатывать нули, вам вообще не нужен класс CloseFont, просто используйте &TTF_CloseFont.
Спасибо. Именно этим я и занимался изначально. Я обнаружил ошибку, связанную с освобождением другого ресурса до моего ресурса шрифта, и попытался решить ее указанным выше методом. Хотя ошибка не была связана с функтором, я оставил ее, потому что обрабатываю другие ресурсы по тому же шаблону.
Спасибо за ответ. В моем случае я должен явно освободить его перед другим ресурсом, и это был единственный способ сделать это.