سؤال

أستخدم Boost::scoped_ptr كثيرًا في الكود الخاص بي وهو رائع ولكني أعمل حاليًا مع برنامج يستخدم Shared_ptr في كل مكان وأتساءل عما إذا كنت أفتقد شيئًا ما.

AFAIK يكون Shared_ptr مفيدًا فقط إذا كانت سلاسل الرسائل المختلفة ستصل إلى نفس البيانات ولا تعرف الترتيب الذي ستنتهي به سلاسل الرسائل (مع ضمان Shared_ptr بوجود الكائن حتى انتهاء مؤشر الترابط الأخير معه).

هل هناك حالات استخدام أخرى؟

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

المحلول

والمواضيع ليست ذات صلة هنا. ما هو مهم هو ما إذا كان من السهل تحديد النقطة التي الكائن لم يعد الاستخدام.

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

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

نصائح أخرى

Afaik A sharbor_ptr مفيد فقط إذا كانت مؤشرات الترابط المختلفة ستصل إلى نفس البيانات

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

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

الفرق بينscoped_ptr وshared_ptr (وauto_ptr) هو نسخ الدلالات بشكل أساسي.

  • يتم تحديد نطاق_ptr لـ "تخصيص الموارد هو التهيئة" وغير قابل للنسخ (لا يمكن مشاركته مع مثيلات أخرى ولا يمكن نقل الملكية)
  • Shared_ptr مخصص للاستعادة التلقائية للذاكرة عند مشاركتها بين أطراف متعددة
  • auto_ptr قابل للنسخ (وينقل الملكية عند تعيينه)

هناك اختلاف مهم آخر بين Shared_ptr وscoped_ptr وهو أن Shared_ptr فقط يعمل مع Weak_ptr.تُستخدم المؤشرات الضعيفة لكسر دورات المؤشرات المشتركة، وبالتالي تجنب تسرب الذاكرة، ولكن يمكن استخدام Weak_ptr لأكثر من ذلك.

يمكن استخدام المؤشرات المشتركة والضعيفة للتعبير عن الفرق بين المراجع المالكة وغير المالكة.تؤدي الملكية الواضحة للبيانات إلى تصميم أنظف، لذلك يجب أن تكون كائنات البيانات مملوكة عندما يكون ذلك ممكنًا واحد كائن آخر من خلال Share_ptr.يجب أن تكون جميع المراجع الأخرى طويلة الأمد لكائنات البيانات مؤشرات ضعيفة، تعبر عن عدم ملكيتها للبيانات.في كل مرة تصل فيها أي وحدات غير مملوكة إلى البيانات، فإنها تحتاج إلى تحويل ضعيف_ptr إلى مشترك_ptr، وعند هذه النقطة قد تجد أن كائن البيانات لم يعد موجودًا.ومع ذلك، في حين أن الوحدات غير المالكة تصل إلى كائن البيانات، فإنها تحتفظ به من خلال Shared_ptr العابر، مما يضمن التشغيل الآمن حتى لو كان الكائن المالك سيحرر البيانات.

وكما أجبت، shared_ptr حول الملكية المشتركة. ومع ذلك، أود أن يجادل بأن الملكية المشتركة عموما أمرا سيئا (الاستثناءات موجودة، مثل نمط وزن الذبابة) وأنه من الأفضل لتحديد مالك ووضع scoped_ptr هناك.

وA shared_ptr هو نوع مؤشر الذكية التي لا عد المرجعية. إذا كان هناك مالك واحد فقط للكائن (حالة متكررة)، ثم scoped_ptr هو الحل الصحيح. إذا يمكن أن تكون مشتركة الكائن بين أجزاء متعددة من رمز، ثم سوف shared_ptr تدع أن دمر الكائن إلى أن يتم الإفراج عن جميع ما يشير إلى ذلك.

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