我将对象(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
对象)被自然销毁?
答案 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
。