【问题标题】:Using .reset() to free a boost::shared_ptr with sole ownership使用 .reset() 释放具有唯一所有权的 boost::shared_ptr
【发布时间】:2010-09-14 10:58:30
【问题描述】:

我将一个对象 (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对象)自然销毁?

【问题讨论】:

    标签: c++ memory-management boost sdl-image


    【解决方案1】:

    shared_ptr::reset() 会将引用计数减一。如果这导致计数降至零,则 shared_ptr 指向的资源将被释放。

    所以我认为你的答案是,是的,这会奏效。或者您可以简单地让 screenFont 变量由于超出范围或其他原因而被破坏,如果这就是即将发生的事情。

    要明确一点,shared_ptr的正常用法是你让它自然销毁,当它自然降为零时它会处理refcount并释放资源。仅当您需要在 shared_ptr 被自然破坏之前释放该共享资源的特定实例时才需要 reset()。

    【讨论】:

    • 感谢您的回复。就我而言,我必须在另一个资源之前显式释放它,这是我发现的唯一方法。
    • 要明确一点 - reset() 不会释放持有的资源,除非它导致引用计数降至零 - 它不会强制引用计数为零。
    【解决方案2】:

    Mike B 回答了您的问题,所以我将评论您的代码。如果TTF_OpenFont 不返回空值,或者TTF_CloseFont 可以无害地处理空值,则根本不需要CloseFont 类,只需使用&amp;TTF_CloseFont

    【讨论】:

    • 谢谢。这就是我最初正在做的事情。我发现一个与在我的字体资源之前释放的另一个资源相关的错误,并尝试通过上述方法解决它。尽管该错误与仿函数无关,但我保留了它,因为我正在处理具有相同模式的其他资源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多