Using .reset() to free a boost::shared_ptr with sole ownership

送分小仙女□ 提交于 2019-12-23 08:08:21

问题


I'm storing an object (TTF_Font) in a shared_ptr that is provided to me from a third-party API. I cannot use new or delete on the object, so the shared_ptr is also provided a "freeing" functor.

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

If, later, I need to explicitly free this object is it correct to do this:

screenFont.reset();

And then let screenFont (the actual shared_ptr object) be destroyed naturally?


回答1:


shared_ptr<>::reset() will drop the refcount by one. If that results in the count dropping to zero, the resource pointed to by the shared_ptr<> will be freed.

So I think the answer for you is, yes that will work. Or you can simply let the screenFont variable be destructed due to dropping out of scope or whatever, if that's what's about to happen.

To be clear, the normal usage of shared_ptr<> is that you let it be destructed naturally, and it will deal with the refcount and freeing the resource when it drops to zero naturally. reset() is only required if you need to release that particular instance of the shared resource before the shared_ptr<> would be naturally destructed.




回答2:


Mike B's answered your question, so I'll just comment on your code. If TTF_OpenFont doesn't return null, or if TTF_CloseFont can handle nulls harmlessly, you don't need a CloseFont class at all, just use &TTF_CloseFont.



来源:https://stackoverflow.com/questions/156373/using-reset-to-free-a-boostshared-ptr-with-sole-ownership

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!