سؤال

في مشروعي الحالي، أنا أستخدم boost::shared_ptr على نطاق واسع تماما.

في الآونة الأخيرة بدأت زملائي في الفريق أيضا باستخدام weak_ptr. وبعد أنا لا أعرف أي واحد للاستخدام ومتى.

بصرف النظر عن هذا، ماذا علي أن أفعل إذا أردت تحويل weak_ptr ل shared_ptr. وبعد هل وضع قفل على weak_ptr لخلق shared_ptr تؤثر على التعليمات البرمجية في مؤشر ترابط آخر؟

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

المحلول

بشكل عام وملخص،

مؤشرات قوية ضمان صلاحية خاصة بهم. استخدمها، على سبيل المثال، عندما:

  • أنت تملك الكائن الذي يتم الإشارة إليه؛ أنت تنشئها وتدميرها
  • لم تكن قد حددت السلوك إذا لم يكن الكائن
  • تحتاج إلى فرض أن الكائن موجود.

مؤشرات ضعيفة ضمان معرفة صلاحية خاصة بهم. استخدمها، على سبيل المثال، عندما:

  • يمكنك الوصول إليها، لكنها ليست لك.
  • لقد حددت السلوك إذا كان الكائن غير موجود

قفل () على مؤشر ضعيف إرجاع مؤشر قوي؛ هذه هي الطريقة التي تصل إلى المؤشر الضعيف. إذا لم يعد الكائن صالحا (تم حذفه، إلخ)، فسيكون المؤشر القوي لاغيا، وإلا فسوف يشير إلى الكائن. سوف تحتاج إلى التحقق من ذلك.

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

تتمتع مؤشرات التعزيز المشتركة أيضا بجمع جامع القمامة مثل الميزات، نظرا لأن آخر مؤشر قوي على كائن يذهب بعيدا أو نقاط أخرى، يتم حذف الكائن.

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

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

نصائح أخرى

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

خلاف ذلك، يمكنك استخدام shared_ptr.

لمزيد من المعلومات، تحقق من دفعة توثيق.

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

هناك سببان لاستخدام مؤشر ضعيف:

  1. للقضاء على تكلفة زيادة عدد المرجعية / النقصان؛ ومع ذلك، يجب أن لا تفعل ذلك لأنها عرضة للخطأ ولا ينقذ الكثير من الوقت
  2. في هياكل بيانات مسك الدفاتر، على سبيل المثال، لديك فهرس لجميع الكائنات فو "على قيد الحياة"، أي استخدم في مكان آخر، ولا تريد الاحتفاظ بفو حيا في الفهرس في حالة انتهاء جميع الاستخدامات "الحقيقية". هذه هي حالة الاستخدام الواقعي الأساسي لمؤشرات ضعيفة. بالطبع وجود الآخرين أيضا.

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

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

ربما لا يجب أن تحاول استخدام المؤشرات الضعيفة على الإطلاق ما لم تحاول تنفيذ مجمع القمامة، وهي ليست فكرة ساخنة في C ++ لأنه من الصعب للغاية تتبع كل ما قد يحدث خطأ كافية.

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