std::unique_ptr
المؤشّر الذكي الحصري std::unique_ptr
std::unique_ptr مؤشّر ذكي يملك كائنًا على الكومة حصريًا ويحرّره تلقائيًا بالهادم — تطبيق مباشر لمبدأ RAII، ولا يمكن نسخه.
unique_ptr يغلّف مؤشّرًا خامًا ويضمن تحرير الذاكرة تلقائيًا عند خروجه من النطاق (RAII)، فتتخلص نهائيًا من الحاجة لـ delete اليدوية ومخاطرها. اسمه «حصري» لأنه لا يمكن نسخه إطلاقًا — كائن واحد فقط يملك المورد بأي لحظة — لكن يمكن نقل الملكية لكائن unique_ptr آخر عبر std::move، وحينها يصبح الأصل فارغًا (nullptr).
هو الخيار الافتراضي والأول لإدارة أي ذاكرة ديناميكية بكود C++ حديث؛ لا تكلفة أداء إضافية تقريبًا مقارنة بمؤشّر خام.
الصياغة
std::unique_ptr<Type> p = std::make_unique<Type>(args);
📄 مثال
#include <memory> std::unique_ptr<int> p = std::make_unique<int>(42); std::cout << *p; // 42 // std::unique_ptr<int> p2 = p; // خطأ ترجمة — النسخ ممنوع std::unique_ptr<int> p2 = std::move(p); // نقل الملكية مسموح // p أصبح nullptr الآن، p2 يملك القيمة } // p2 يتحرر تلقائيًا هنا بلا delete يدوي
أهم النقاط
| العنصر | الوظيفة |
|---|---|
| std::make_unique<T>(args) | الطريقة الآمنة والموصى بها لإنشاء unique_ptr (منذ C++14) |
| get() | يُرجع المؤشّر الخام دون التخلي عن الملكية — للتمرير لواجهات C قديمة فقط |
| reset() | يحرّر الكائن الحالي فورًا ويعيد ضبط المؤشّر لـ nullptr أو كائن جديد |
| operator bool | يسمح بفحص if (p) للتأكد أن المؤشّر ليس فارغًا |
💡 نصائح عملية
- استخدم std::make_unique دائمًا بدل new مباشرة — أأمن مع الاستثناءات وأقصر كتابةً
- مرّر unique_ptr بدالة عبر std::move إذا أردت نقل الملكية فعليًا، أو بمرجع (const&) إذا أردت الوصول فقط بدون نقل
⚠️ أخطاء شائعة
- محاولة نسخ unique_ptr مباشرة (p2 = p;) — خطأ ترجمة متعمَّد لأن الملكية حصرية
- استخدام get() لحذف المؤشّر يدويًا (delete p.get();) — يسبب حذفًا مزدوجًا (double free) حين يحرره unique_ptr تلقائيًا لاحقًا
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.