Использование .reset() для освобождения boost::shared_ptr с единоличным владением

StackOverflow https://stackoverflow.com/questions/156373

Вопрос

Я сохраняю объект (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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top