2008-10-01 23 views
7

我將對象(TTF_Font)存儲在shared_ptr中,該對象是通過第三方API提供給我的。我不能在對象上使用new或delete,所以shared_ptr也提供了一個「釋放」函數。使用.reset()釋放單獨擁有的boost :: 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對象)來破壞自然?

回答

16

shared_ptr <> :: reset()會將引用計數減1。如果這導致計數下降到零,那麼由shared_ptr指向的資源將被釋放。

所以我認爲你的答案是,是的,這將工作。或者你可以簡單地讓screenFont變量由於超出範圍或者其他因素而被破壞,如果這就是即將發生的事情。

需要明確的是,shared_ptr的<>的正常使用是你讓它自然破壞,當它降到零,自然會處理引用計數和釋放資源。只有在shared_ptr自然遭到破壞之前需要釋放共享資源的特定實例時,才需要reset()。

+1

感謝您的回覆。就我而言,我必須在另一個資源之前明確地釋放它,這是我發現的唯一途徑。 – 2008-10-01 05:55:54

+2

只需要清楚 - reset()不會釋放持有的資源,除非它導致refcount降至零 - 它不會強制將refcount設置爲零。 – 2008-10-01 05:59:08

0

Mike B回答了您的問題,因此我只會對您的代碼發表評論。如果TTF_OpenFont不返回null,或者TTF_CloseFont可以無害地處理空值,那麼根本不需要CloseFont類,只需使用&TTF_CloseFont即可。

相關問題