تخطَّ إلى المحتوى

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 الكامل بالعربي.