الذاكرة الديناميكية باستخدام 'new'
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 6 من 56.
حتى الآن، تعاملت مع المؤشرات التي تشير إلى متغيرات تم إنشاؤها بالفعل في برنامجك. ولكن ماذا لو كنت بحاجة إلى إنشاء متغيرات أثناء تشغيل برنامجك؟ هنا يصبح تخصيص الذاكرة الديناميكي باستخدام الكلمة المفتاحية new أمراً ضرورياً.
تتيح لك الكلمة المفتاحية new تخصيص ذاكرة لمتغير على الكومة (heap) أثناء تنفيذ البرنامج. وعلى عكس المتغيرات العادية التي يتم إنشاؤها على المكدس (stack)، فإن الذاكرة المخصصة ديناميكيًا تستمر حتى تقوم بتحريرها صراحةً.
int* ptr = new int; // يخصص ذاكرة لعدد صحيح
*ptr = 42; // يسند قيمة للذاكرة المخصصةفي هذا المثال، يقوم new int بتخصيص ذاكرة كافية لتخزين عدد صحيح ويعيد مؤشراً إلى موقع الذاكرة هذا. يمكنك بعد ذلك استخدام عامل إلغاء المرجعية (dereference operator) لتعيين القيم والوصول إلى المتغير المخصص ديناميكياً تماماً مثل أي مؤشر آخر.
تخصيص الذاكرة الديناميكي مفيد بشكل خاص عندما لا تعرف مقدار الذاكرة التي ستحتاجها حتى وقت التشغيل، أو عندما تحتاج إلى بقاء المتغيرات خارج النطاق الذي تم إنشاؤها فيه. هذه المرونة تجعل new أداة قوية لبناء برامج أكثر تعقيداً.
التحدي
سهلقم بإنشاء برنامج يوضح تخصيص الذاكرة الديناميكي باستخدام الكلمة المفتاحية new لتخصيص ذاكرة لمتغير أثناء تنفيذ البرنامج.
سيتم توفير المدخلات التالية:
- قيمة صحيحة (integer) لتخزينها في الذاكرة المخصصة ديناميكيًا
يجب على برنامجك القيام بما يلي:
- استخدام الكلمة المفتاحية
newلتخصيص ذاكرة ديناميكيًا لعدد صحيح - تخزين المؤشر (pointer) الذي تم إرجاعه بواسطة
newفي متغير مؤشر يسمىnumPtr - استخدام عامل إلغاء المرجعية (dereference operator) لتعيين القيمة المدخلة إلى الذاكرة المخصصة ديناميكيًا
- طباعة القيمة المخزنة في الذاكرة المخصصة ديناميكيًا عن طريق إلغاء مرجعية المؤشر
- طباعة عنوان الذاكرة المخزن في المؤشر
استخدم تنسيق المخرجات الدقيق التالي:
Value: [value]
Address: [memory address]سيتم عرض عنوان الذاكرة بتنسيق سداسي عشري (hexadecimal)، وهو الطريقة التي تعرض بها لغة C++ عناوين الذاكرة للذاكرة المخصصة ديناميكيًا.
ورقة مرجعية
تقوم الكلمة المفتاحية new بتخصيص ذاكرة لمتغير في الذاكرة الكومة (heap) أثناء تنفيذ البرنامج:
int* ptr = new int; // يخصص ذاكرة لعدد صحيح
*ptr = 42; // يسند قيمة للذاكرة المخصصةعلى عكس المتغيرات العادية التي يتم إنشاؤها في الذاكرة المكدسة (stack)، تستمر الذاكرة المخصصة ديناميكيًا حتى يتم تحريرها صراحةً ويمكن أن تظل موجودة خارج النطاق الذي أُنشئت فيه.
جرّب بنفسك
#include <iostream>
using namespace std;
int main() {
// قراءة المدخلات
int value;
cin >> value;
// TODO: اكتب الكود الخاص بك أدناه
// استخدم 'new' لتخصيص الذاكرة ديناميكيًا لعدد صحيح
// قم بتخزين المؤشر في متغير باسم 'numPtr'
// قم بتعيين قيمة المدخلات إلى الذاكرة المخصصة ديناميكيًا
// إخراج النتيجة
cout << "Value: " << /* قم بإلغاء مرجع numPtr هنا */ << endl;
cout << "Address: " << /* اطبع العنوان المخزن في numPtr */ << endl;
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المؤشرات والذاكرة
ما هو المؤشر؟معامل العنوان (Address-Of)معامل الوصول للقيمة (Dereference)المؤشرات الفارغة (Null Pointers)المؤشرات والمصفوفاتالذاكرة الديناميكية باستخدام 'new'تحرير الذاكرة باستخدام 'delete'مراجعة - تمارين على المؤشرات2المتجهات (المصفوفات الديناميكية)
مقدمة إلى std::vectorإنشاء Vectorإضافة العناصرالوصول إلى العناصرحجم الـ Vectorالتكرار باستخدام For Loopالـ Range-Based For Loopإزالة العناصرملخص - عمليات الـ Vector