new / delete
التخصيص الديناميكي اليدوي new / delete
new يحجز ذاكرة على الكومة (heap) ويُرجع مؤشّرًا لها، وdelete يحرّرها يدويًا — الأداة الأصلية لإدارة الذاكرة بـ C++ قبل الإشارات الذكية.
على عكس المتغيّرات العادية اللي تُحجز على المكدّس (stack) وتُحرَّر تلقائيًا عند خروج النطاق، new تحجز ذاكرة على الكومة تبقى موجودة حتى تُحرَّرها أنت يدويًا بـ delete. هذا يمنحك تحكمًا كاملًا بعمر الكائن لكنه يحمّلك مسؤولية كاملة: نسيان delete يسبب تسريب ذاكرة (memory leak)، واستخدام مؤشّر بعد delete يسبب سلوكًا غير معرَّف.
بكود C++ حديث، الإشارات الذكية (unique_ptr وshared_ptr) تدير هذا تلقائيًا وتُفضَّل دائمًا على new/delete اليدوي المباشر.
الصياغة
Type* ptr = new Type(args); delete ptr; Type* arr = new Type[n]; delete[] arr;
📄 مثال
int* p = new int(42); std::cout << *p; // 42 delete p; // إلزامي، وإلا تسريب ذاكرة p = nullptr; // عادة جيدة بعد الحذف int* arr = new int[5]; delete[] arr; // [] إلزامية مع المصفوفات
أهم النقاط
| العنصر | الوظيفة |
|---|---|
| new Type(args) | يحجز ذاكرة لكائن واحد على الكومة ويستدعي الباني |
| new Type[n] | يحجز مصفوفة على الكومة — يجب تحريرها بـ delete[] وليس delete |
| delete / delete[] | تحرير الذاكرة — استخدام النوع الخطأ (delete بدل delete[]) سلوك غير معرَّف |
💡 نصائح عملية
- بكود حديث، استخدم std::unique_ptr أو std::make_unique بدل new/delete المباشر دائمًا
- لو اضطررت لـ new يدويًا، ضع p = nullptr; بعد delete مباشرة لتفادي استخدام مؤشّر معلَّق
⚠️ أخطاء شائعة
- نسيان delete يسبب تسريب ذاكرة يتراكم مع الوقت ويستهلك موارد النظام
- استخدام delete على مصفوفة مُخصّصة بـ new[] بدل delete[] — سلوك غير معرَّف
- استخدام مؤشّر بعد تحريره بـ delete (dangling pointer) — من أشهر أسباب الأعطال بـ C++
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.