تخصيص الذاكرة على الكومة باستخدام new/delete
أدر الذاكرة الديناميكية
تخصيص الذاكرة على الكومة باستخدام new/delete درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
الذاكرة الديناميكية باستخدام new
يخصّص المعامل new كائنًا على الكومة (المخزن الحر) ويعيد مؤشرًا إليه. تبقى كائنات الكومة موجودة حتى تحرّرها صراحةً.
#include <iostream>
int main() {
int* p = new int(42); // heap allocation
std::cout << *p << "\n";
delete p; // release it
}التحرير باستخدام delete
يجب مطابقة كل new باستدعاء واحد فقط لـ delete. نسيانه يسبب تسرّبًا للذاكرة، واستدعاؤه مرتين يفسد الكومة.
#include <iostream>
int main() {
double* d = new double(3.5);
std::cout << *d << "\n";
delete d; // exactly once
}المصفوفات: new[] و delete[]
استخدم new[] للمصفوفات، وقابله بـ delete[]. إن استخدام new[] مع delete العادي سلوك غير معرّف.
#include <iostream>
int main() {
int* arr = new int[3]{1, 2, 3};
for (int i = 0; i < 3; ++i) std::cout << arr[i] << "\n";
delete[] arr; // note the [ ]
}لماذا نستخدم الكومة؟
استخدم الكومة عندما يجب أن يستمر عمر كائن بعد انتهاء الدالة التي أنشأته، أو عندما لا يُعرف حجمه إلا وقت التشغيل. وفي غير ذلك، فضّل المكدس.
عمر الكومة يُدار يدويًا
بخلاف المكدس، لا تحرّر الكومة الكائنات تلقائيًا. أنت تتحكم في الوقت الدقيق لتحرير الذاكرة — وتتحمل مسؤولية ذلك.
#include <iostream>
int* makeCounter() {
return new int(0); // survives the function
}
int main() {
int* c = makeCounter();
std::cout << *c << "\n";
delete c;
}عيّن المؤشرات إلى nullptr بعد delete
بعد الحذف، عيّن المؤشر إلى nullptr حتى يفشل الاستخدام غير المقصود بوضوح بدلًا من الوصول إلى ذاكرة حُرّرت.
#include <iostream>
int main() {
int* p = new int(9);
delete p;
p = nullptr; // now p is safe to check
if (!p) std::cout << "freed\n";
}قد يفشل التخصيص
إذا نفدت ذاكرة النظام، يرمي new الاستثناء std::bad_alloc. ويُعد ذلك احتمالًا حقيقيًا عند إجراء تخصيصات كبيرة جدًا.
مخازن مؤقتة بحجم وقت التشغيل
يمكن لمصفوفات الكومة استخدام حجم يُحسَب وقت التشغيل — وهو أمر لا تستطيع مصفوفات المكدس فعله بطريقة محمولة بين المنصات.
#include <iostream>
int main() {
int n = 5;
int* buf = new int[n];
for (int i = 0; i < n; ++i) buf[i] = i * i;
std::cout << buf[4] << "\n";
delete[] buf;
}فضّل المؤشرات الذكية
يتجنب C++ الحديث استخدام new/delete الخام. إذ يحرّر std::unique_ptr وstd::make_unique الذاكرة تلقائيًا عند خروج المؤشر من النطاق.
#include <iostream>
#include <memory>
int main() {
auto p = std::make_unique<int>(42);
std::cout << *p << "\n";
} // freed automaticallyتكلفة الكومة
يكون تخصيص الكومة أبطأ من تخصيص المكدس؛ إذ يبحث عن كتلة حرة ويحدّث بيانات الإدارة. وقد تؤثر التخصيصات الصغيرة المتكررة سلبًا في الأداء.
طابق كل new
القاعدة الذهبية: يحتاج كل new إلى delete واحد، ويحتاج كل new[] إلى delete[] واحد. والأفضل من ذلك أن تترك للمؤشرات الذكية مهمة إدارة الأمر.
اختبار سريع
اختبر مدى فهمك لتخصيص الذاكرة على الكومة.
مراجعة
تعلّمت تخصيص الذاكرة على الكومة باستخدام new/new[] وتحريرها باستخدام delete/delete[]. تعيش كائنات الكومة بعد انتهاء نطاقها، لكنها تتطلب تنظيفًا يدويًا. طابق كل تخصيص بعملية تحرير، وعيّن المؤشرات التي حُرّرت ذاكرتها إلى القيمة الفارغة، وفضّل std::unique_ptr في الشيفرة الحديثة.
الأسئلة الشائعة
هل درس «تخصيص الذاكرة على الكومة باستخدام new/delete» مجاني؟
نعم — نص درس «تخصيص الذاكرة على الكومة باستخدام new/delete» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «تخصيص الذاكرة على الكومة باستخدام new/delete»؟
أدر الذاكرة الديناميكية تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تخصيص الذاكرة على الكومة باستخدام new/delete»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تخصيص الذاكرة على المكدس
- تخصيص الذاكرة على الكومة باستخدام new/delete
- دورة حياة الكائن
- أخطاء الذاكرة الشائعة