سؤال

النظر في التعليمات البرمجية التالية.

using boost::shared_ptr;
struct B;
struct A{
    ~A() { std::cout << "~A" << std::endl; }
    shared_ptr<B> b;    
};
struct B {
    ~B() { std::cout << "~B" << std::endl; }
    shared_ptr<A> a;
};

int main() {
    shared_ptr<A> a (new A);
    shared_ptr<B> b (new B);
    a->b = b;
    b->a = a;

    return 0;
}

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

ماذا علي أن أفعل إذا كنت بحاجة إلى مراجع عبر الفصول؟

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

المحلول

إذا كانت لديك مراجع دائرية مثل هذا، يجب أن يحمل كائن واحد weak_ptr إلى الآخر، وليس shared_ptr.

من ال shared_ptr المقدمة:

لأن التنفيذ يستخدم عد مرجعي، دورات shared_ptr لن يتم استصلاح الحالات. على سبيل المثال، إذا main() حاصل على shared_ptr ل A, ، والتي تحمل بشكل مباشر أو غير مباشر shared_ptr ارجع الى A, Aعدد الاستخدام سيكون 2. تدمير الأصلي shared_ptr سوف نرحل A تتدلى مع عدد الاستخدام من 1. الاستخدام weak_ptr إلى "كسر دورات".

شكرا، غلين، للرابط.

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