[英]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.