我将对象(TTF_Font)存储在从第三方API提供给我的shared_ptr中。我不能在对象上使用new或delete,因此screenFont还提供了一个<!> quot; freeing <!> quot;算符。

// 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();

然后让<=>(实际的<=>对象)自然被销毁?

有帮助吗?

解决方案

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

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

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top