سؤال

لدي العديد من boost::shared_ptr<MyClass> والكائنات في مرحلة ما يريد عمدا delete بعض منهم لتحرير بعض الذاكرة.(وأنا أعلم في هذه النقطة التي لن تحتاج وأشار إلى MyClass الأشياء بعد الآن.) كيف يمكن أن أفعل ذلك ؟

أعتقد أنه لا يمكنك فقط الاتصال delete() مع الخام مؤشر أن أحصل مع get().

رأيت وظيفة get_deleter(shared_ptr<T> const & p) في boost::shared_ptr, لكنني غير متأكد من كيفية استخدامها ، كما يقول التجريبية الحق بجانبه.(أعتقد أن لدينا دفعة 1.38.)

ربما فقط تعيين جديد فارغ boost::shared_ptr إلى متغير ؟ التي ينبغي أن نرمي القيمة القديمة وحذفها.

هل كانت مفيدة؟

المحلول

أنت فقط لم

ptr.reset();

ترى shared_ptr دليل.وهو ما يعادل

shared_ptr<T>().swap(ptr)

يمكنك الاتصال reset على كل مؤشر الذكية التي لا ينبغي أن مرجع كائن بعد الآن.آخر هذه reset (أو أي عمل آخر أن أسباب مرجع تنخفض إلى الصفر ، في الواقع) سوف يسبب الكائن أن يكون حرا رائد باستخدام deleter تلقائيا.

ربما كنت مهتما في مؤشر الذكية تقنيات البرمجة.فقد دخول عن تأخر deallocation.

نصائح أخرى

إذا كنت تريد أن تكون قادرة على حذف عمدا الكائنات (أفعل كل ذلك الوقت) ثم لديك لاستخدام ملكية واحدة. لقد تم استدراجهم إلى استخدام shared_ptr عندما لا يكون مناسبا للتصميم الخاص بك.

المغزى من boost::shared_ptr<T> هو أن pointee كائن سيتم حذف بالضبط في لحظة عندما لا shared_ptr<T>s نقطة في ذلك -- وهذا هو ، shared_ptr<T> لافتا في هذا الكائن يخرج من نطاق أو هو تكليف للإشارة إلى كائن آخر.لذا كل ما عليك فعله لحذف كائن تأكد من أن هناك لا shared_ptr<T>s مشيرا في ذلك.E. g.إذا كان لديك فقط واحد shared_ptr<T> دعا p مشيرا إلى كائن ، إما السماح لها تقع خارج نطاق او الاتصال p.reset() (أي ما يعادل p = NULL عن سهل المؤشر) ، أو إسناد ذلك إلى نقطة في أي شيء آخر.

إذا كان لديك اثنين shared_ptr<T>s لافتا في وجوه, سوف تحتاج إلى إعادة تعيين كل منهم.

تحرير: بفضل dehmann بالنسبة مشيرا إلى أن p = NULL; ليست في الواقع رمز صالح عن shared_ptr<T>... :)

وما تريد القيام به هو العودة الإشارات الضعيفة باستخدام دفعة :: weak_ptr التي يمكن تحويلها إلى shared_ptr عند الحاجة. هذا يمكن أن تسمح لك للسيطرة على عمر الكائن في shared_ptr وتلك التي ترغب في الوصول إليه يمكن أن تعقد على weak_ptr ومحاولة تحويله إلى shared_ptr. إذا فشل ذلك تحويل، ثم يمكنهم إعادة الاستعلام وتقديم الكائن مرة أخرى إلى الذاكرة.

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