سؤال

بمعنى آخر، كيف يحتفظ التنفيذ بتتبع العد؟

هل هناك كائن يشبه خريطة يحتفظ به والتي يمكن الوصول إليها بكل shared_ptr الحالات التي يكون مفتاحها هو عنوان المؤشر وقيمته هو عدد المراجع؟ إذا قمت بتنفيذ shared_ptr, هذه هي الفكرة الأولى التي تأتي إلى ذهني.

هل هناك إمكانية لتسريب الذاكرة في حالة هذه المؤشرات الذكية عد هذه المرجعية؟ إذا كان الأمر كذلك، كيف يمكنني تجنبها؟

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

المحلول

لقد رأيت مقارنتين مختلفة غير تدخلية إلى هذا:

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

إذا ذهبت هنا والتمرير إلى الأسفل، هناك مخطط ممتاز يشرح هذه الأساليب بشكل أكثر وضوحا.

نصائح أخرى

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

يحتوي كل كائن مؤشر ذكي على عدد مرجعي مشترك - واحد لكل مؤشر RAW.

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

لا. shared_ptr مجرد الحفاظ على مؤشر إضافي واحد للعد المرجعي.

عند إنشاء نسخة من CHARED_PTR كائنات مؤشر نسخ مع عدد المراجع، قم بزيادة تكنولوجيا المعلومات، ونسخ المؤشر على الكائن المضغوط.

بقدر ما أتذكر، كانت هناك مشكلة في مرجع مؤشر العد المعالج في فصل من C ++ الفعال.

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

يعالج العديد من الإجابات بالطريقة التي يتم فيها تخزين عدد المرجع (يتم تخزينها في ذاكرة مشتركة لجميع Shared_Ptr التي تحمل نفس المؤشر الأصلي)، ولكن معظمها تهرب من مشكلة التسريبات.

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

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

ستشارك المؤشرات المشتركة كل من المورد (المؤشر) ومعلومات المرجع الإضافية_Count. عند استخدام المؤشرات الضعيفة، يتم مضاعفة عدد المرجع: هناك عدد مرجعي مؤشر مشترك وعدد مرجعي ضعيف مؤشر. يتم إصدار المورد كلما وصل عدد المؤشرات المشتركة إلى 0، ولكن يتم ترك معلومات المرجع غير حية حتى يتم إصدار مؤشر ضعيف آخر.

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

إنه أقل مربكة من النص أعلاه يبدو أنه ... سأحاول مرة أخرى لاحقا.

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