0Pricing
C++ Academy · درس

‏unique_ptr والملكية الحصرية

عبّر عن دلالات المالك الوحيد باستخدام unique_ptr والأنواع القابلة للنقل فقط.

‏unique_ptr والملكية الحصرية درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

المؤشر الذكي ذو المالك الواحد

يمتلك std::unique_ptr<T> كائنًا واحدًا على الكومة. وعند تدمير unique_ptr، يحذف الكائن. ولا يمكن نسخه، بل يمكن نقله فقط.

إنشاء unique_ptr

استخدموا std::make_unique في C++14، فهو آمن مع الاستثناءات ومختصر.

#include <memory>
auto w = std::make_unique<Widget>();         // default-constructed
auto p = std::make_unique<Point>(3, 4);       // forwarded args

استخدامه مثل المؤشر

يدعم unique_ptr عمليات المؤشرات المعتادة.

auto p = std::make_unique<Point>(3, 4);
std::cout << p->x;        // arrow access
std::cout << (*p).y;      // dereference
if (p) std::cout << "non-null";

لا يمكن نسخه، ويمكن نقله

سيعني النسخ وجود مالكين، وهذا يخالف معنى «unique». أما النقل فينقل الملكية.

std::unique_ptr<int> a = std::make_unique<int>(1);
std::unique_ptr<int> b = std::move(a);
// a is now empty, b owns the int

تمريره إلى الدوال

بالقيمة، مع std::move: نقل الملكية. وبالمرجع: استعارة من دون امتلاك.

void consume(std::unique_ptr<Widget> w);   // takes ownership
void inspect(const Widget& w);              // borrows

auto w = std::make_unique<Widget>();
consume(std::move(w));
// w is now empty
inspect(*w);                                // (after re-creating)

إرجاعه من الدوال

يجب أن تُرجع الدالة التي تخصص كائنًا وتنقل ملكيته std::unique_ptr.

std::unique_ptr<Widget> create() {
    return std::make_unique<Widget>();
}

إعادة الضبط والتحرير

تحذف reset() الكائن الحالي، وتتولى اختياريًا ملكية كائن جديد. أما release() فتتخلى عن الملكية وتُرجع المؤشر الخام.

auto p = std::make_unique<int>(10);
p.reset(new int(20));    // delete the old, own the new
int* raw = p.release();   // p is now empty
delete raw;               // caller must delete

‏get(): استعارة المؤشر الخام

تُرجع get() المؤشر الخام من دون التخلي عن الملكية. استخدموها للتكامل غير المالك.

auto p = std::make_unique<int>(42);
legacy_api(p.get());      // p still owns it

unique_ptr للمصفوفات

للمصفوفات، استخدموا unique_ptr<T[]>. ويُتاح الوصول بالفهرس باستخدام []، ويُستدعى delete[] عند التدمير.

auto arr = std::make_unique<int[]>(10);
arr[0] = 99;
std::cout << arr[0];

حاذفات مخصصة

وفّروا حاذفًا مخصصًا كمعامل قالب عندما لا يكون المورد ذاكرة خامًا، مثل مقابض الملفات وموارد نظام التشغيل.

auto closer = [](FILE* f) { if (f) std::fclose(f); };
std::unique_ptr<FILE, decltype(closer)> file(std::fopen("a.txt","r"), closer);

الأداء

مع الحاذف الافتراضي، يساوي unique_ptr المؤشر الخام في الحجم والسرعة، أي من دون تكلفة إضافية.

تحقق سريع

لماذا يمنع std::unique_ptr النسخ؟

مراجعة

‏std::unique_ptr هو المؤشر الذكي الافتراضي: لا يضيف تكلفة، ويوفر ملكية حصرية، ويمكن نقله لكن لا يمكن نسخه. فضّلوا std::make_unique عند الإنشاء.

الأسئلة الشائعة

هل درس «‏unique_ptr والملكية الحصرية» مجاني؟

نعم — نص درس «‏unique_ptr والملكية الحصرية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏unique_ptr والملكية الحصرية»؟

عبّر عن دلالات المالك الوحيد باستخدام unique_ptr والأنواع القابلة للنقل فقط. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «‏unique_ptr والملكية الحصرية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. لماذا تستبدل المؤشرات الذكية new وdelete الخامّتين
  2. ‏unique_ptr والملكية الحصرية
  3. ‏shared_ptr وweak_ptr والملكية المشتركة
  4. المحذوفات المخصّصة ودوال الإنشاء
← العودة إلى C++ Academy