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

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

جزء من قسم المنطق وتدفق التنفيذ في رحلة C على Coddy. الدرس 35 من 63.

عندما تقوم بتخصيص memory ديناميكيًا using malloc()، تظل تلك memory في حالة allocated حتى تقوم بتحريرها صراحةً. تُعدّ الدالة free() أداتك لإعادة memory المخصّصة ديناميكيًا إلى النظام عند الانتهاء من using إياها.

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

#include <stdlib.h>

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

إن عدم استدعاء free() ينشئ ما يُعرف باسم تسرّب memory. تظل مساحة memory allocated محجوزة بواسطة برنامجك، رغم أنك لم تعد using إياها. في البرامج طويلة التشغيل أو البرامج التي تخصّص memory بشكل متكرر، يمكن أن تستهلك هذه التسرّبات كل memory المتاحة للنظام وتتسبب في مشكلات في الأداء أو حدوث أعطال.

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

challenge icon

التحدي

سهل

اكتب برنامج C يوضّح دورة الحياة الكاملة لتخصيص dynamic memory وإلغاء تخصيصها. يجب أن يقوم برنامجك بما يلي:

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

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

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

4
15 8 23 12

فيجب أن يكون الناتج:

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

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

جرّب بنفسك

#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اختبر نفسك

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

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم C عبر الإنترنت