كيفية تجنب تسرب الذاكرة مع Shared_ptr؟
-
11-09-2019 - |
سؤال
النظر في التعليمات البرمجية التالية.
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
لن يتم استصلاح الحالات. على سبيل المثال، إذاmain()
حاصل علىshared_ptr
لA
, ، والتي تحمل بشكل مباشر أو غير مباشرshared_ptr
ارجع الىA
,A
عدد الاستخدام سيكون 2. تدمير الأصليshared_ptr
سوف نرحلA
تتدلى مع عدد الاستخدام من 1. الاستخدامweak_ptr
إلى "كسر دورات".
شكرا، غلين، للرابط.
لا تنتمي إلى StackOverflow