عمر المرجع والمراجع المتدلية
تجنّب المراجع المتدلية من خلال التفكير بعناية في أعمار الكائنات.
عمر المرجع والمراجع المتدلية درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
ما المرجع المعلّق؟
يصبح المرجع معلّقًا عندما يُدمَّر الكائن الذي يشير إليه. ويؤدي استخدامه إلى سلوك غير معرّف، إذ يمكن أن يحدث أي شيء.
المثال التقليدي
إرجاع مرجع إلى متغير محلي. ينتهي عمر المتغير المحلي عند عودة الدالة، بينما يحتفظ المستدعي بمرجع إلى ذاكرة لم تعد حية.
// BUG
int& bad() {
int x = 10;
return x; // x dies here
}
int& r = bad();
std::cout << r; // UBالمراجع إلى عناصر الحاويات
يصبح المرجع إلى عنصر في std::vector معلّقًا إذا أعاد المتجه تخصيص ذاكرته. فقد يؤدي إضافة عناصر إلى نقل كامل مساحة التخزين.
std::vector<int> v = {1, 2, 3};
int& r = v[0];
v.push_back(99); // may reallocate
std::cout << r; // possibly UBالمراجع داخل الخرائط والقوائم
توفر بعض الحاويات (std::list وstd::map وstd::unordered_map بالنسبة إلى العقد التي لم تتأثر) مكررات ومراجع مستقرة. أما std::vector وstd::deque فلا توفر ذلك.
قواعد عمر الكائنات المؤقتة
يمدّد مرجع const عمر الكائن المؤقت، لكن الدالة التي تُرجع ذلك المرجع لا تمدده أكثر.
// Subtle BUG
const std::string& f() {
return std::string("temp"); // dies at return
}
const std::string& s = f(); // danglingالعمر في عبارات التهيئة داخل if (C++17)
تعيش المتغيرات الموجودة في عبارات تهيئة if/switch في C++17 طوال جسم if/switch، وهذا مفيد، لكن انتبه إلى النطاق.
if (const auto& it = map.find(k); it != map.end()) {
use(it->second);
}
// `it` is dead hereأعضاء المراجع في الفئات
يؤدي تخزين مرجع كعضو في فئة إلى ربط عمر الفئة بعمر الكائن المشار إليه. ولا يمكن للفئة أن يتجاوز عمرها عمر الكائن المشار إليه. استخدم ذلك فقط عندما تتطلب دلالات الملكية هذا الأمر.
المؤشر أم المرجع للملكية الاختيارية
لا يمكن أن يكون المرجع فارغًا، لكن إذا انتهى عمر الكائن المشار إليه يصبح المرجع غير صالح. ويمكن للمؤشرات تمثيل الحالات الاختيارية أو المحتمل أن تصبح معلّقة بصورة أوضح.
استخدم المؤشرات الذكية بدلًا من ذلك
بالنسبة إلى الملكية المشتركة، استخدم std::shared_ptr. إذ يُبقي المؤشر الكائن حيًا ما دام هناك مؤشر shared_ptr واحد على الأقل. وقد غُطي ذلك في دورة المؤشرات الذكية.
مساعدة المترجم: lifetimebound
تُصدر المترجمات الحديثة (Clang وGCC) تحذيرات بشأن بعض أنماط المراجع المعلّقة. فعّل -Wdangling-reference عندما يكون متاحًا.
أسلوب شائع: أنواع المناظير
إن std::string_view وstd::span مناظير غير مالكة. ولديهما مخاوف العمر نفسها الموجودة في المراجع، ويتطلبان العناية نفسها.
اختبار سريع
أي عملية قد تجعل المراجع إلى عناصر std::vector غير صالحة؟
مراجعة
لا تمدد المراجع عمر أي شيء ولا تمتلكه، بل هي أسماء مستعارة لكائن موجود. وتصبح معلّقة إذا انتهى عمر الكائن قبلها. احذر من إرجاع مراجع إلى متغيرات محلية، ومن إعادة تخصيص الحاويات، ومن بقاء الكائنات المؤقتة بعد انتهاء عمرها.
الأسئلة الشائعة
هل درس «عمر المرجع والمراجع المتدلية» مجاني؟
نعم — نص درس «عمر المرجع والمراجع المتدلية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «عمر المرجع والمراجع المتدلية»؟
تجنّب المراجع المتدلية من خلال التفكير بعناية في أعمار الكائنات. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «عمر المرجع والمراجع المتدلية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا تُعدّ المراجع أسماءً مستعارة للمتغيرات
- التمرير بالقيمة مقابل التمرير بالمرجع
- مراجع const ومتى تُستخدم
- عمر المرجع والمراجع المتدلية