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