2008-10-01 12 views
7

मैं एक shared_ptr में एक ऑब्जेक्ट (TTF_Font) संग्रहीत कर रहा हूं जो मुझे किसी तृतीय-पक्ष API से प्रदान किया जाता है। मैं ऑब्जेक्ट पर नया या हटा नहीं सकता, इसलिए shared_ptr को "फ्रीिंग" फ़ैक्टर भी प्रदान किया जाता है।एक बढ़ावा देने के लिए .reset() का उपयोग :: एकमात्र स्वामित्व के साथ shared_ptr

screenFont.reset(); 

और फिर screenFont (वास्तविक 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()); 

हैं, तो बाद में, मैं की जरूरत है इस वस्तु को स्पष्ट रूप से मुक्त करने के लिए ऐसा करने के लिए सही है?

उत्तर

16

shared_ptr <> :: रीसेट() एक करके रीफ्रंट छोड़ देगा। यदि परिणाम शून्य पर गिरने के परिणामस्वरूप होता है, तो साझा_ptr <> द्वारा निर्देशित संसाधन को मुक्त कर दिया जाएगा।

तो मुझे लगता है कि आपके लिए जवाब है, हाँ यह काम करेगा। या आप आसानी से स्क्रीनफॉन्ट वैरिएबल को गुंजाइश से बाहर निकलने के कारण नष्ट कर सकते हैं या जो भी हो, अगर ऐसा होने वाला है।

स्पष्ट होने के लिए, shared_ptr <> का सामान्य उपयोग यह है कि आप इसे स्वाभाविक रूप से नष्ट कर देते हैं, और यह रीफ्रैंट से निपटने और संसाधन को मुक्त करने पर स्वाभाविक रूप से शून्य हो जाएगा। रीसेट() केवल तभी आवश्यक है जब साझा किए गए संसाधन के उस विशेष उदाहरण को साझा_ptr <> को स्वाभाविक रूप से नष्ट कर दिया जाए।

+1

प्रतिक्रिया के लिए धन्यवाद। मेरे मामले में, मुझे इसे किसी अन्य संसाधन से पहले स्पष्ट रूप से मुक्त करना होगा, और यह ऐसा करने का एकमात्र तरीका था। –

+2

बस स्पष्ट होने के लिए - रीसेट() होल्ड संसाधन को तब तक मुक्त नहीं करेगा जब तक कि यह शून्य पर गिरने वाले रिफॉउंट में न हो - यह refcount को शून्य पर मजबूर नहीं करता है। –

0

माइक बी ने आपके प्रश्न का उत्तर दिया, इसलिए मैं बस आपके कोड पर टिप्पणी करूंगा। यदि TTF_OpenFont शून्य वापस नहीं आता है, या TTF_CloseFont हानिरहित रूप से नल को संभाल सकता है, तो आपको CloseFont कक्षा की आवश्यकता नहीं है, बस &TTF_CloseFont का उपयोग करें।

+0

धन्यवाद। यही वह है जो मैं शुरू में कर रहा था। मुझे अपने संसाधन संसाधन से पहले किसी अन्य संसाधन से मुक्त एक बग मिला और उपर्युक्त विधि द्वारा इसे हल करने का प्रयास किया। हालांकि बग फंक्चर से असंबंधित था, मैंने इसे रखा क्योंकि मैं एक ही पैटर्न के साथ अन्य संसाधनों को संभालने में कामयाब रहा हूं। –

संबंधित मुद्दे