تحرير الذاكرة باستخدام 'delete'
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 7 من 56.
عندما تقوم بتخصيص الذاكرة ديناميكيًا باستخدام new، فإن تلك الذاكرة لا تختفي تلقائيًا عند انتهائك منها. على عكس المتغيرات العادية التي يتم تنظيفها تلقائيًا، تظل الذاكرة المخصصة ديناميكيًا قيد الاستخدام حتى تقوم بتحريرها صراحةً. هنا تصبح الكلمة المفتاحية delete ضرورية.
تقوم الكلمة المفتاحية delete بإلغاء تخصيص الذاكرة التي تم تخصيصها مسبقاً باستخدام new. عندما تستخدم delete، فإنك تخبر النظام أنك انتهيت من تلك الذاكرة وأنه يمكن إعادة استخدامها لأغراض أخرى:
int* ptr = new int(42); // تخصيص الذاكرة
// استخدام الذاكرة...
delete ptr; // تحرير الذاكرةالقاعدة الأساسية لإدارة الذاكرة الديناميكية بسيطة: لكل new، يجب أن يكون هناك delete مقابل. إذا نسيت حذف الذاكرة المخصصة ديناميكيًا، فإنك تتسبب في تسرب للذاكرة - حيث يستمر برنامجك في الاحتفاظ بذاكرة لم يعد يستخدمها، مما قد يؤدي في النهاية إلى نفاد الذاكرة المتاحة في نظامك.
بعد استدعاء delete على مؤشر، يصبح ذلك المؤشر غير صالح ولا ينبغي استخدامه مرة أخرى. من الممارسات الجيدة تعيين المؤشر إلى nullptr بعد الحذف لتجنب استخدامه عن طريق الخطأ.
التحدي
سهلقم بإنشاء برنامج يوضح دورة حياة الذاكرة الديناميكية الكاملة من خلال تخصيص الذاكرة باستخدام new، واستخدامها، ثم إلغاء تخصيصها بشكل صحيح باستخدام delete.
سيتم توفير المدخلات التالية:
- قيمة صحيحة (integer) لتخزينها في الذاكرة المخصصة ديناميكيًا
- قيمة صحيحة ثانية لتحديث القيمة المخزنة
يجب أن يقوم برنامجك بما يلي:
- استخدام
newلتخصيص ذاكرة ديناميكيًا لعدد صحيح وتخزين المؤشر في متغير يسمىdynamicPtr - تعيين قيمة المدخل الأول إلى الذاكرة المخصصة ديناميكيًا باستخدام عامل إلغاء المرجعية (dereference operator)
- طباعة القيمة الأولية المخزنة في الذاكرة المخصصة ديناميكيًا
- تحديث القيمة في الذاكرة المخصصة ديناميكيًا إلى قيمة المدخل الثاني
- طباعة القيمة المحدثة
- استخدام
deleteلتحرير الذاكرة المخصصة ديناميكيًا - تعيين المؤشر إلى
nullptrبعد الحذف - طباعة رسالة تأكيد تفيد بأنه تم تحرير الذاكرة بنجاح
استخدم تنسيق المخرجات الدقيق التالي:
Initial value: [first value]
Updated value: [second value]
Memory freed successfullyورقة مرجعية
الكلمة المفتاحية delete تلغي تخصيص الذاكرة التي تم تخصيصها مسبقاً باستخدام new:
int* ptr = new int(42); // تخصيص الذاكرة
// استخدام الذاكرة...
delete ptr; // تحرير الذاكرةلكل new، يجب أن يكون هناك delete مقابل لتجنب تسرب الذاكرة (memory leaks).
بعد استدعاء delete، قم بتعيين المؤشر إلى nullptr لتجنب استخدام ذاكرة غير صالحة عن طريق الخطأ:
delete ptr;
ptr = nullptr;جرّب بنفسك
#include <iostream>
using namespace std;
int main() {
// قراءة قيم المدخلات
int firstValue, secondValue;
cin >> firstValue;
cin >> secondValue;
// مهام: اكتب الكود الخاص بك أدناه
// 1. تخصيص ذاكرة باستخدام new وتخزينها في dynamicPtr
// 2. تعيين firstValue إلى الذاكرة المخصصة
// 3. طباعة القيمة الأولية
// 4. التحديث باستخدام secondValue
// 5. طباعة القيمة المحدثة
// 6. حذف الذاكرة وتعيين المؤشر إلى nullptr
// 7. طباعة رسالة تأكيد
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المؤشرات والذاكرة
ما هو المؤشر؟معامل العنوان (Address-Of)معامل الوصول للقيمة (Dereference)المؤشرات الفارغة (Null Pointers)المؤشرات والمصفوفاتالذاكرة الديناميكية باستخدام 'new'تحرير الذاكرة باستخدام 'delete'مراجعة - تمارين على المؤشرات2المتجهات (المصفوفات الديناميكية)
مقدمة إلى std::vectorإنشاء Vectorإضافة العناصرالوصول إلى العناصرحجم الـ Vectorالتكرار باستخدام For Loopالـ Range-Based For Loopإزالة العناصرملخص - عمليات الـ Vector