Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تحرير الذاكرة باستخدام free()

جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 35 من 63.

عندما تقوم بتخصيص الذاكرة ديناميكيًا باستخدام malloc()، تظل تلك الذاكرة مخصصة حتى تقوم بتحريرها صراحةً. تعد الدالة free() هي أداتك لإعادة الذاكرة المخصصة ديناميكيًا إلى النظام عند الانتهاء من استخدامها.

تأخذ الدالة free() وسيطًا واحدًا: مؤشرًا إلى كتلة الذاكرة التي تريد إلغاء تخصيصها. يجب أن يكون هذا هو نفس المؤشر الذي تم إرجاعه بواسطة malloc() (أو الدوال ذات الصلة مثل calloc()).

#include <stdlib.h>

int *ptr = (int*)malloc(sizeof(int));  // تخصيص الذاكرة
*ptr = 42;  // استخدام الذاكرة
free(ptr);  // تحرير الذاكرة عند الانتهاء

يؤدي الفشل في استدعاء free() إلى ما يُعرف بـ تسرب الذاكرة. تظل الذاكرة المخصصة محجوزة بواسطة برنامجك على الرغم من أنك لم تعد تستخدمها. في البرامج التي تعمل لفترات طويلة أو البرامج التي تخصص الذاكرة بشكل متكرر، يمكن أن تستهلك هذه التسريبات كل ذاكرة النظام المتاحة وتتسبب في مشاكل في الأداء أو حالات تعطل.

تذكر: كل malloc() يجب أن يكون لها free() مقابلة. هذا الاقتران ضروري لإدارة الذاكرة المسؤولة في برمجة C.

challenge icon

التحدي

سهل

اكتب برنامجاً بلغة C يوضح دورة الحياة الكاملة لتخصيص الذاكرة الديناميكي وإلغاء تخصيصها. يجب على برنامجك القيام بما يلي:

  1. قراءة عدد صحيح count من المستخدم يمثل عدد الأعداد الصحيحة المراد تخزينها
  2. استخدام malloc() مع sizeof() لتخصيص ذاكرة ديناميكياً لمصفوفة من count من الأعداد الصحيحة
  3. التحقق مما إذا كان تخصيص الذاكرة ناجحاً - إذا فشل، قم بطباعة Memory allocation failed! وإنهاء البرنامج
  4. إذا نجح التخصيص، قم بطباعة Memory allocated successfully!
  5. قراءة count من القيم الصحيحة من المستخدم وتخزينها في المصفوفة المخصصة
  6. حساب وطباعة مجموع كل القيم بالتنسيق التالي: Sum: [value]
  7. إيجاد وطباعة القيمة القصوى بالتنسيق التالي: Maximum: [value]
  8. استخدام free() لإلغاء تخصيص الذاكرة
  9. طباعة Memory freed successfully! لتأكيد عملية التنظيف

تذكر تضمين الترويسة <stdlib.h> لاستخدام malloc() و free(). يوضح هذا التحدي الاقتران الضروري بين malloc() و free() لمنع تسرب الذاكرة (memory leaks) في برامجك.

على سبيل المثال، إذا كان الإدخال هو:

4
15 8 23 12

يجب أن يكون مخرجك:

Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!

يعزز هذا التحدي المفهوم الحيوي المتمثل في أن كل كتلة ذاكرة مخصصة ديناميكياً يجب تحريرها بشكل صحيح عندما لا تعود هناك حاجة إليها، مما يكمل دورة إدارة الذاكرة المسؤولة في برمجة C.

ورقة مرجعية

استخدم free() لإلغاء تخصيص الذاكرة التي تم تخصيصها باستخدام malloc():

#include <stdlib.h>

int *ptr = (int*)malloc(sizeof(int));  // تخصيص ذاكرة
*ptr = 42;  // استخدام الذاكرة
free(ptr);  // تحرير الذاكرة عند الانتهاء

يجب أن يكون لكل malloc() وظيفة free() مقابلة لها لمنع تسرب الذاكرة. يجب أن يكون المؤشر الذي يتم تمريره إلى free() هو نفس المؤشر الذي تم إرجاعه بواسطة malloc().

جرّب بنفسك

#include <stdio.h>
#include <stdlib.h>

int main() {
    int count;
    
    // قراءة عدد الأعداد الصحيحة المراد تخزينها
    scanf("%d", &count);
    
    // TODO: اكتب الكود الخاص بك أدناه
    // 1. تخصيص الذاكرة باستخدام malloc() مع sizeof()
    // 2. التحقق مما إذا كان التخصيص ناجحاً
    // 3. قراءة القيم الصحيحة وتخزينها
    // 4. حساب المجموع وإيجاد القيمة القصوى
    // 5. تحرير الذاكرة المخصصة
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow