Использование .reset () для освобождения надстройки :: shared_ptr с единоличным владением - PullRequest
7 голосов
/ 01 октября 2008

Я храню объект (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 объект) будет естественным образом уничтожен?

Ответы [ 2 ]

16 голосов
/ 01 октября 2008

shared_ptr <> :: reset () сбросит рефконт на единицу. Если это приводит к снижению количества до нуля, ресурс, на который указывает shared_ptr <>, будет освобожден.

Так что я думаю, что ответ для вас - да, это сработает. Или вы можете просто позволить переменной screenFont быть уничтоженной из-за выпадения из области видимости или чего-то еще, если это то, что должно произойти.

Для ясности, обычное использование shared_ptr <> заключается в том, что вы позволяете ему быть уничтоженным естественным образом, и он будет иметь дело с refcount и освобождает ресурс, когда он естественно падает до нуля. reset () требуется только в том случае, если вам нужно освободить этот конкретный экземпляр общего ресурса до того, как shared_ptr <> будет естественным образом уничтожен.

0 голосов
/ 01 октября 2008

Майк Б ответил на ваш вопрос, поэтому я просто прокомментирую ваш код. Если TTF_OpenFont не возвращает ноль или TTF_CloseFont может безболезненно обрабатывать нули, вам вообще не нужен класс CloseFont, просто используйте &TTF_CloseFont.

...