使用.reset()释放具有唯一所有权的boost :: shared_ptr
时间:2020-03-06 14:57:45 来源:igfitidea点击:
我将对象(TTF_Font)存储在从第三方API提供给我的shared_ptr中。我不能在该对象上使用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"对象)自然销毁?
解决方案
shared_ptr <> :: reset()会将引用计数减一。如果这导致计数下降到零,则将释放shared_ptr <>指向的资源。
因此,我认为对答案是,是的,这将行得通。或者,我们可以简单地让screenFont变量由于超出范围或者任何其他原因而被破坏,如果这将要发生的话。
需要明确的是,shared_ptr <>的正常用法是让它自然破坏,并且它将处理refcount并在自然下降为零时释放资源。仅当我们需要在自然破坏shared_ptr <>之前释放共享资源的特定实例时,才需要reset()。
Mike B回答了问题,所以我只对代码发表评论。如果TTF_OpenFont不返回null,或者TTF_CloseFont可以无害地处理null,则根本不需要CloseFont类,只需使用&TTF_CloseFont。

