7

我将一个对象 ( TTF_Font) 存储在shared_ptr从第三方 API 提供给我的 a 中。我不能在对象上使用 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对象)自然销毁?

4

2 回答 2

16

shared_ptr<>::reset() 会将引用计数减一。如果这导致计数降至零,则 shared_ptr<> 指向的资源将被释放。

所以我认为你的答案是,是的,这会奏效。或者您可以简单地让 screenFont 变量由于超出范围或其他原因而被破坏,如果这是即将发生的事情。

需要说明的是,shared_ptr<>的正常用法是让它自然销毁,当它自然降为零时它会处理refcount并释放资源。仅当您需要在 shared_ptr<> 被自然破坏之前释放该共享资源的特定实例时才需要 reset() 。

于 2008-10-01T05:53:37.687 回答
0

Mike B 回答了你的问题,所以我将评论你的代码。如果TTF_OpenFont不返回空值,或者如果TTF_CloseFont可以无害地处理空值,则根本不需要CloseFont类,只需使用&TTF_CloseFont.

于 2008-10-01T05:57:00.547 回答