باستخدام .إعادة تعيين (مجانية) دفعة::shared_ptr مع المالك الوحيد
-
03-07-2019 - |
سؤال
أنا تخزين كائن (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
.