質問

サードパーティAPIから提供されたTTF_Fontにオブジェクト(shared_ptr)を保存しています。オブジェクトでnewまたはdeleteを使用できないため、screenFontには<!> quot; freeing <!> quot;も提供されます。ファンクター。

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

そして、<=>(実際の<=>オブジェクト)が自然に破壊されるようにしますか?

役に立ちましたか?

解決

shared_ptr <!> lt; <!> gt; :: reset()は、refcountを1つ削除します。その結果、カウントがゼロになった場合、shared_ptr <!> lt; <!> gt;が指すリソース。解放されます。

だからあなたの答えは、はい、うまくいくと思います。または、もしそれが起ころうとしているのであれば、単に範囲外か何かのためにscreenFont変数を破壊させることができます。

明確にするために、shared_ptr <!> lt; <!> gt;の通常の使用法それは自然に破壊され、refcountを処理し、自然にゼロになったときにリソースを解放します。 reset()は、shared_ptr <!> lt; <!> gt;の前に共有リソースの特定のインスタンスを解放する必要がある場合にのみ必要です。自然に破壊されます。

他のヒント

マイクBがあなたの質問に答えたので、コードについてコメントします。 TTF_OpenFontがnullを返さない場合、またはTTF_CloseFontがnullを無害に処理できる場合、CloseFontクラスはまったく必要なく、単に&TTF_CloseFontを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top