使用.reset()释放具有唯一所有权的boost :: shared_ptr

时间:2008-10-01 05:49:11

标签: c++ memory-management boost sdl-image

我将对象(TTF_Font)存储在从第三方API提供给我的shared_ptr中。我不能在对象上使用new或delete,因此shared_ptr也提供了一个“freeing”函子。

// 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 个答案:

答案 0 :(得分:16)

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

所以我认为你的答案是肯定会有效的。或者你可以简单地让screenFont变量因为掉落范围或其他什么而被破坏,如果这就要发生了。

要清楚,shared_ptr的正常用法&lt;&gt;就是你让它自然被破坏了,当它自然地降到零时它会处理引用并释放资源。只有在shared_ptr&lt;&gt;之前需要释放共享资源的特定实例时才需要reset()。会自然被破坏。

答案 1 :(得分:0)

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