سؤال

أنا باستخدام دفعة/shared_ptr المؤشرات في جميع أنحاء بلدي التطبيق.عند آخر مرجع إلى كائن يتم تحريرها ، shared_ptr سيتم حذف كائن بالنسبة لي.الكائنات في تطبيق تؤيد الأحداث في موقع مركزي من التطبيق ، على غرار المراقب/المشترك نمط.

في وجوه المتلفات ، وجوه الاشتراك نفسها من قائمة الاشتراكات.قائمة الاشتراكات هو في الأساس مجرد list<weak_ptr<MyObject> >.ما أريد القيام به هو شيء مشابه لهذا:

Type::~Type()
{
  Subscriptions::Instance()->Remove(shared_from_this());
}

مشكلتي هنا هو أن shared_from_this لا يمكن أن تسمى في المتلفات حتى رمز أعلاه سوف رمي استثناء.

في بلادي القديمة التنفيذ قائمة الاشتراك كان مجرد قائمة من المؤشرات وبعد ذلك عملت.ولكن أريد أن استخدام weak_ptr المراجع بدلا من ذلك إلى تقليل خطر لي الشد الذاكرة دليل إدارة الذاكرة.

منذ أن كنت تعتمد على shared_ptr للقيام حذف الكائن لا يوجد مكان واحد في قانون بلدي أين يمكنني منطقيا مكان دعوة إلى إلغاء الاشتراك.

أي الأفكار حول ما يجب القيام به في هذه الحالة ؟

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

المحلول

  1. يمكنك تدمير الكائنات عن طريق الاشتراك سبيل المثال ، ثم سوف تلقائيا إزالة المؤشرات.
  2. يمكنك نسيان حرمانهم من الاشتراكات-على weak_ptr هو متعود تكون قادرة على أن تكون مقفلة على أي حال, ثم يمكنك إزالتها.
  3. يمكنك تعيين معرف فريد لكل كائن ثم قم بإزالة عبر معرف فريد لا shared_ptr
  4. يمكنك تمرير عادي مؤشر إلى إزالة بدلا من واحد مشترك -- أنها سوف تكون بمثابة "ID".

نصائح أخرى

مشكلتي هنا هو أن shared_from_this لا يمكن أن تسمى في destructors حتى رمز أعلاه سوف رمي استثناء.

فإنه سيتم رمي استثناء لأنها منتهية الصلاحية, بحكم التعريف ، المدمر.

ماذا تريد على أي حال ؟ و "منتهية الصلاحية" مشترك المؤشر ؟ مجرد إنشاء فارغة مشترك المؤشر.

أو منتهية الصلاحية ضعف المؤشر ؟

ربما إذا لاحظت أن "المشكلة" لا shared_from_this رمي (وهو أحد أعراض المشاكل) ولكن كل أصحاب كونها بطبيعتها بالفعل إعادة تعيين أو دمرت على أن نقطة ضعف مؤشرات يجري انتهت تعادل فارغة الافتراضية التي تم إنشاؤها ضعف مؤشر ( * ) ، لذلك أنت فقط يجب أن تمر الافتراضي تهيئة ضعف المؤشر.

أيضا Subscriptions::Instance()->Remove(weak_OR_owning_pointer) لا معنى كلتا الحالتين (إما ضعيفة أو امتلاك المؤشر) كما لا يمكنك مقارنة ضعف مؤشر إلى أي شيء, يمكنك فقط محاولة قفل ذلك (ثم لا مقارنة).

لذلك يمكنك فقط إزالة انتهت ضعف المؤشرات. حجج Remove لا طائل منه.

(*) إما هذا أو لديك خطيرة جدا مزدوج علة مزدوجة ملكية الكائن تدمر!

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