سؤال

افترض أن لدي فئة foo، وأرغب في استخدام std::map لتخزين بعض التعزيزات::shared_ptrs، على سبيل المثال:

class foo;

typedef boost::shared_ptr<foo> foo_sp;
typeded std::map<int, foo_sp> foo_sp_map;

foo_sp_map m;

إذا قمت بإضافة foo_sp جديد إلى الخريطة ولكن المفتاح المستخدم موجود بالفعل، فهل سيتم حذف الإدخال الحالي؟على سبيل المثال:

foo_sp_map m;

void func1()
{
    foo_sp p(new foo);
    m[0] = p;
}

void func2()
{
    foo_sp p2(new foo);
    m[0] = p2;
}

هل سيتم تحرير المؤشر الأصلي (p) عند استبداله بـ p2؟أنا متأكد من أنه سيكون كذلك، لكنني أعتقد أنه يستحق السؤال/المشاركة.

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

المحلول

أولاً، عنوان سؤالك يقول Boost::auto_ptr، لكنك في الواقع تعني Boost::shared_ptr

ونعم، سيتم تحرير المؤشر الأصلي (إذا لم تكن هناك أي مراجع مشتركة أخرى له).

نصائح أخرى

يعتمد الأمر على ما يحدث في حياتك..قسم

تحتوي فئة الحاوية الخاصة بك على نسخ من مثيلات foo_sp، عند التنفيذ m[0] = p2; نسخة من p الذي كان في الأصل في ذلك المكان يخرج عن النطاق.في ذلك الوقت سيتم حذفه إذا لم يكن هناك foo_sp يشير إليه.

إذا كانت النسخة التي أعلن عنها في السطر الثاني foo_sp p(new foo); لا يزال موجودًا ولن يتم إلغاء تخصيص الذاكرة.سيتم حذف الإدخال بمجرد إزالة جميع الإشارات إليه.

نظرًا لأن تدفق المكدس لن يسمح لي بالتعليق، فسأجيب فقط.:/

لا أرى "p" يخرج عن النطاق، وبالتالي فإن الكائن المشار إليه به سوف يخرج لا يتم تحريرها.سيظل "p" يشير إليه.

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