تحرير الذاكرة باستخدام 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.
التحدي
سهلاكتب برنامج C يوضّح دورة الحياة الكاملة لتخصيص dynamic memory وإلغاء تخصيصها. يجب أن يقوم برنامجك بما يلي:
- Read عددًا من النوع integer باسم
countمن المستخدم، يمثّل عدد قيم integers المطلوب تخزينها - استخدم
malloc()معsizeof()لتخصيص memory ديناميكيًا لمصفوفة منcountمن قيم integers - تحقّق مما إذا كان تخصيص memory successful — إذا فشل، اطبع
Memory allocation failed!وأنهِ البرنامج - إذا نجح التخصيص، اطبع
Memory allocated successfully! - اقرأ
countمن قيم integers من المستخدم وخزّنها في المصفوفة المخصّصة - احسب واطبع مجموع جميع values بالتنسيق:
Sum: [value] - اعثر على maximum value واطبعه بالتنسيق:
Maximum: [value] - استخدم
free()لإلغاء تخصيص memory - اطبع
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;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية6إدارة الذاكرة
ذاكرة Stack مقابل Heapالتخصيص الديناميكي - malloc()استخدام sizeof() للتخصيصالتحقق من فشل التخصيصتحرير الذاكرة باستخدام free()التخصيص باستخدام calloc()ملخص: المصفوفة الديناميكيةتدرّب بنفسك: مترجم C عبر الإنترنت