使用.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
。