الدرس 39: إدارة الذاكرة الديناميكية: realloc() و free()
تتضمن الإدارة السليمة للذاكرة كلاً من التخصيص وإلغاء التخصيص.
3. دالة free() (إلغاء تخصيص الذاكرة)
تحرر الذاكرة المخصصة ديناميكياً وتعيدها إلى الكومة، مما يمنع تسرب الذاكرة (memory leaks). يجب عليك استدعاء free() مرة واحدة بالضبط لكل استدعاء ناجح لـ malloc أو calloc أو realloc.
القاعدة: free(pointer_to_allocated_block);
c int *p = (int *) malloc(sizeof(int)); *p = 50;
// استخدام الذاكرة...
free(p); // بعد free(p)، يصبح p مؤشراً معلقاً (لا يزال يحمل العنوان القديم)، // لذا فمن الممارسات الجيدة تعيينه إلى NULL. p = NULL;
4. دالة realloc() (إعادة تخصيص الذاكرة)
تغير حجم كتلة الذاكرة التي يشير إليها المؤشر المعطى. يمكنها إما توسيع الكتلة أو تقليصها. يتم الحفاظ على محتويات الكتلة حتى الحجم الأصغر من الحجمين الجديد والقديم.
القاعدة: (type *) realloc(old_pointer, new_size_in_bytes);
c int *data = (int *) malloc(5 * sizeof(int)); // الحجم الأولي 5 // ... ملء البيانات ...
// إعادة التخصيص لتستوعب 10 أعداد صحيحة int *temp = (int *) realloc(data, 10 * sizeof(int));
if (temp != NULL) { data = temp; // تحديث المؤشر إلى موقع الذاكرة الجديد }
هام جداً: إذا فشلت realloc ، فإنها تعيد NULL ولكنها لا تحرر الكتلة الأصلية. قم دائماً بتعيين نتيجة realloc لمؤشر مؤقت أولاً.