.reset()を使用して、boost :: shared_ptrを単独の所有権で解放する
-
03-07-2019 - |
質問
サードパーティ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
を使用します。