باستخدام .إعادة تعيين (مجانية) دفعة::shared_ptr مع المالك الوحيد

StackOverflow https://stackoverflow.com/questions/156373

سؤال

أنا تخزين كائن (TTF_Font) في shared_ptr التي قدمت لي من طرف ثالث API.أنا لا يمكن استخدام جديدة أو حذف على الكائن ، لذلك shared_ptr كما تقدم في "تحرير" functor.

// 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<>::إعادة تعيين() ستنخفض refcount من جانب واحد.إن هذه النتائج في العدد ينخفض إلى الصفر ، الموارد أشار إليه shared_ptr<> سيتم تحرير.

لذلك أعتقد أن الجواب هو نعم هذا العمل.أو يمكنك ببساطة السماح screenFont متغير يجب تدمير بسبب التسرب من نطاق أو أيا كان, إذا كان هذا ما سيحدث.

أن تكون واضحة, الاستخدام العادي من shared_ptr<> هل هذا أنت فليكن تدمير بطبيعة الحال ، فإنه سيتم التعامل مع refcount وتحرير الموارد عندما تنخفض إلى الصفر بشكل طبيعي.إعادة تعيين() مطلوب فقط إذا كنت تحتاج إلى إطلاق سراح هذه الحالة بالذات من الموارد المشتركة قبل shared_ptr<> سيكون بطبيعة الحال انتهى.

نصائح أخرى

أجاب مايك ب على سؤالك ، لذلك سأعلق فقط على الكود الخاص بك. إذا TTF_OpenFont لا تعود فارغة ، أو إذا TTF_CloseFont يمكنك التعامل مع الفرق دون ضرر ، لا تحتاج إلى ملف CloseFont الفصل على الإطلاق ، فقط استخدم &TTF_CloseFont.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top