مقدمة
في الدرس السابق تعرفنا على التجريد (Abstraction)، وعرفنا كيف يساعد على إخفاء تفاصيل التنفيذ غير الضرورية.
في C++ توجد ميزة قوية جدًا وهي القدرة على التعامل المباشر مع الذاكرة، لكن إدارة الذاكرة يدويًا قد تؤدي إلى أخطاء إذا لم يتم التعامل معها بشكل صحيح.
لهذا توفر C++ مفهوم المؤشرات الذكية (Smart Pointers)، والتي تساعد على إدارة الذاكرة تلقائيًا وبطريقة أكثر أمانًا.
ما هو المؤشر الذكي؟
المؤشر الذكي هو كائن يستخدم للإشارة إلى منطقة من الذاكرة، لكنه يمتلك آلية تساعد على إدارة هذه الذاكرة تلقائيًا.
وعند انتهاء الحاجة إلى الكائن، يمكن للمؤشر الذكي تحرير الذاكرة وفقًا لنوعه وطريقة استخدامه.
لماذا نستخدم المؤشرات الذكية؟
عند استخدام المؤشرات العادية، قد يحتاج المبرمج إلى إدارة الذاكرة يدويًا.
نسيان تحرير الذاكرة قد يؤدي إلى تسرب الذاكرة (Memory Leak).
المؤشرات الذكية تقلل الحاجة إلى إدارة الذاكرة يدويًا، وتساعد على جعل الكود أكثر أمانًا.
أنواع المؤشرات الذكية
توفر مكتبة C++ القياسية عدة أنواع مهمة من المؤشرات الذكية، وأشهرها:
unique_ptr
shared_ptr
weak_ptr
لكل نوع طريقة استخدام مختلفة.
unique_ptr
يمثل unique_ptr ملكية حصرية لكائن معين.
أي أن مؤشرًا ذكيًا واحدًا يكون مسؤولًا عن الكائن في الوقت نفسه.
عند انتهاء عمر unique_ptr، يتم تحرير الكائن الذي يملكه تلقائيًا.
shared_ptr
يسمح shared_ptr بوجود أكثر من مؤشر ذكي يشترك في ملكية الكائن نفسه.
تحتفظ C++ بعداد لعدد المالكين، ويتم تحرير الكائن عندما لا يبقى أي shared_ptr يملكه.
weak_ptr
يستخدم weak_ptr للإشارة إلى كائن تتم إدارته بواسطة shared_ptr دون أن يصبح مالكًا له.
وهذا مفيد في بعض التصاميم لتجنب مشاكل دورات الملكية بين الكائنات.
المؤشرات الذكية وRAII
ترتبط المؤشرات الذكية بمفهوم مهم في C++ يسمى RAII.
فكرة RAII هي ربط عمر المورد بعمر الكائن الذي يديره.
وبذلك يمكن تحرير الموارد تلقائيًا عند انتهاء عمر الكائن.
استخدام المؤشرات الذكية
تستخدم المؤشرات الذكية في العديد من المشاريع، مثل:
الألعاب
التطبيقات المكتبية
البرامج الهندسية
الأنظمة الكبيرة
البرامج التي تتعامل مع كائنات ديناميكية
فوائد المؤشرات الذكية
من أهم فوائدها:
تقليل تسرب الذاكرة
تقليل الحاجة إلى delete
تحسين أمان إدارة الذاكرة
جعل ملكية الكائنات أوضح
تسهيل كتابة كود أكثر قابلية للصيانة
أخطاء شائعة عند المبتدئين
من الأخطاء الشائعة:
استخدام shared_ptr في كل الحالات دون حاجة
الخلط بين الملكية والمجرد الإشارة إلى كائن
استخدام المؤشر الذكي بطريقة تؤدي إلى دورة ملكية
عدم فهم الفرق بين unique_ptr وshared_ptr وweak_ptr
لذلك يجب اختيار نوع المؤشر الذكي بناءً على من يملك الكائن وكيف تتم مشاركة ملكيته.
ملخص الدرس
تعرفنا في هذا الدرس على المؤشرات الذكية (Smart Pointers) في C++، وعرفنا كيف تساعد على إدارة الذاكرة بطريقة أكثر أمانًا، كما تعرفنا على unique_ptr وshared_ptr وweak_ptr ومفهوم RAII.
في الدرس الثاني والثلاثون سنتعرف على القوالب (Templates) في C++، وسنفهم كيف يمكن كتابة كود يعمل مع أنواع بيانات مختلفة دون تكراره.



