簡體   English   中英

使用.reset()釋放具有唯一所有權的boost :: shared_ptr

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

我將對象( TTF_Font )存儲在從第三方API提供給我的shared_ptr中。 我不能在對象上使用new或delete,因此shared_ptr也提供了一個“freeing”仿函數。

// 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可以無害地處理空值,則根本不需要CloseFont類,只需使用&TTF_CloseFont

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM