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