Professional Documents
Culture Documents
Heap Reservation
Heap Reservation
HEAP
RESERVAT
ION
RPB TEAM
RA'AD ABU JAISH
Heap Reservation malloc
الدالة mallocهي دالة في لغة البرمجة Cوتستخدم لحجز مساحة في الذاكرة .تأخذ
الدالة معامل واحد فقط وهو حجم المساحة التي ترغب في حجزها بالبايت.
تقوم الدالة mallocبحجز مساحة متتالية في الذاكرة بحجم يعادل المعامل الذي تم
تمريره إليها ،وتقوم بإرجاع عنوان الذاكرة األولى في هذه المساحة المحجوزة.
ومن الجدير بالذكر أن الذاكرة التي تم حجزها باستخدام mallocليست مهيأة بقيمة
معينة .وبالتالي ،قد تحتوي على بيانات عشوائية قد تكون تركتها عمليات سابقة في
الذاكرة .لذلك ،قبل استخدام الذاكرة المحجوزة ،يجب تهيئتها بالقيم المناسبة.
على سبيل المثال ،إذا كنت ترغب في حجز مساحة تخزين بحجم 10بايت ،يمكنك استخدام
الدالة mallocعلى النحو التالي:
RPB - TEAM
في هذا المثال ،يتم حجز مساحة في الذاكرة تكفي لتخزين 10أعداد صحيحة .يتم
تحويل العنوان ال ُم ر َج ع من ِق َب ل mallocإلى عنوان من نوع intباستخدام عبارة
( )*intلتوضيح نوع البيانات ال ُم خ ّز نة في الذاكرة.
بعد االستخدام الكامل للذاكرة المحجوزة ،يجب تحريرها باستخدام الدالة freeعلى
النحو التالي:
RPB - TEAM
;)free(numbers
@RA'AD ABU JAISH
هذا ُي حّر ر المساحة في الذاكرة ويجعلها متاحة للحجز مرة أخرى الحًق ا في البرنامج .من
المهم التأكد من تحرير الذاكرة المحجوزة باستخدام freeعندما لم تعد هناك حاجة
الستخدامها لتجنب تسريب الذاكرة المحجوزة
RPB -TEAM
RA'AD ABU JAISH
Heap Reservation calloc
الدالة callocهي دالة في لغة البرمجة Cتستخدم لحجز مساحة في الذاكرة وتهيئتها بقيمة
صفر .تأخذ الدالة معاملين nmemb :و ،sizeحيث nmembيحدد عدد العناصر التي ترغب في حجز
مساحة لها ،و sizeيحدد حجم كل عنصر بالبايت.
تقوم الدالة callocبحجز مساحة متتالية في الذاكرة بحجم يعادل حاصل ضرب nmembو .size
وتقوم بتهيئة جميع البايتات في هذه المساحة المحجوزة بالقيمة صفر.
ثم تقوم بإرجاع عنوان الذاكرة األولى في هذه المساحة المحجوزة.
على سبيل المثال ،إذا كنت ترغب في حجز مساحة تخزين لـ 5أعداد صحيحة ،حيث يكون حجم كل
عدد صحيح 4بايت ،يمكنك استخدام الدالة callocعلى النحو التالي:
RPB - TEAM
في هذا المثال ،تتم حجز مساحة في الذاكرة تكفي لتخزين 5أعداد صحيحة ،وتهيئة
جميع البايتات في هذه المساحة بقيمة صفر .يتم تحويل العنوان الُم رَج ع من ِق َب ل calloc
إلى عنوان من النوع intباستخدام عبارة ( )*intلتوضيح نوع البيانات المخزنة في الذاكرة.
بعد االنتهاء من استخدام المساحة المحجوزة ،يجب تحريرها باستخدام الدالة freeكما
في الدالة :malloc
RPB - TEAM
;)free(numbers
@RA'AD ABU JAISH
هذا يقوم بتحرير المساحة في الذاكرة وجعلها متاحة للحجز مرة أخرى في وقت الحق في
البرنامج.
RPB -TEAM
RA'AD ABU JAISH
Heap Reservation malloc and calloc
الفرق الرئيسي بين mallocو callocهو فيما يتعلق بتهيئة الذاكرة المحجوزة .إليك
الفروق الرئيسية بينهما:
-1قيمة البايتات الُم هيأة:
:mallocال يقوم بتهيئة البايتات بقيمة معينة .يتم ترك البايتات غير مهيأة ،مما يعني
أنها قد تحتوي على بيانات عشوائية.
:callocيقوم بتهيئة جميع البايتات بقيمة صفر .يضمن أن جميع البتات في المساحة
المحجوزة تكون صفر ،بمعنى أنها تحتوي على قيمة افتراضية صفر.
-2المعامالت المستخدمة:
:mallocتأخذ معامل واحد وهو حجم المساحة المطلوبة بالبايت.
:callocتأخذ معاملين ،األول هو عدد العناصر التي ترغب في حجزها والثاني هو حجم
كل عنصر بالبايت.
-3األداء:
:mallocيكون أداءه أسرع من callocألنه ال يقوم بتهيئة البايتات .إذا كنت ال تحتاج إلى
تهيئة البايتات بقيمة صفر ،فقد تفضل استخدام mallocألداء أسرع.
:callocيكون أداءه أبطأ من mallocبسبب الخطوة اإلضافية لتهيئة البايتات بقيمة
صفر .ومع ذلك ،في بعض الحاالت ،قد تكون تهيئة الذاكرة بقيمة صفر ضرورية،
وبالتالي فإن callocيوفر هذه الميزة.
RPB -TEAM
RA'AD ABU JAISH
Heap Reservation free
تعتبر الدالة )free(void *ptrوظيفتها إطالق الذاكرة المخصصة سابًق ا .وتستخدم هذه
الدالة إلرجاع الذاكرة التي تم تخصيصها باستخدام دالة تخصيص الذاكرة.
تأخذ الدالة freeمؤشًر ا void *ptrكمدخل ،وهذا المؤشر يشير إلى البداية األولية
للمساحة في الذاكرة التي تم تخصيصها سابًق ا .عند تنفيذ الدالة ،freeيقوم النظام بإلغاء
تخصيص الذاكرة وإطالقها لإلعادة استخدامها في وقت الحق.
من المهم أن يتم تحديد مؤشر صالح الستخدام الدالة .freeيجب أن يكون المؤشر الممرر
إلى الدالة freeقد تم الحصول عليه باستخدام دالة تخصيص الذاكرة ،مثل mallocأو calloc
أو ،reallocوأال يكون المؤشر قد تم تحريره مسبًق ا.
بعد تنفيذ الدالة ،freeيعتبر البيانات الموجودة في تلك المساحة في الذاكرة غير صالحة
وتعتبر "قمامة" ،ويمكن إعادة استخدامها في أي وقت من قبل النظام.
مثال على استخدام الدالة :free
RPB - TEAM
تحذير :بعد استخدام الدالة ،freeيجب عدم الوصول إلى المساحة التي تمت إزالتها
بواسطتها ،حيث يمكن أن تؤدي محاولة الوصول إلى سلوك غير محدد ،مثل الوصول إلى
بيانات غير صالحة أو حدوث تعارض في الذاكرة.
RPB -TEAM
RA'AD ABU JAISH
Heap Reservation realloc RPB -TEAM
دالة )realloc(void *ptr, size_t sizeهي دالة ُت ستخدم لتغيير حجم مساحة الذاكرة التي تم
تخصيصها مسبًق ا والتي يشير إليها المؤشر الذي يتم تمريره كمعامل أول .يتم تحديد الحجم
الجديد لهذه المساحة باستخدام المعامل الثاني الذي ُي مرر للدالةُ .ت رجع الدالة عنوان الذاكرة
الجديدة بعد تغيير الحجم ،وال يكون هذا العنوان بالضرورة مماثاًل للعنوان األصلي الذي تم
تمريره كمعامل.
عند استخدام الدالة ،reallocيجب أن يتم تمرير مؤشر صحيح وصالح للذاكرة كقيمة المعامل
األول ُ .ptrي شير هذا المؤشر إلى بداية المساحة التي تم تخصيصها مسبًق ا .قيمة المعامل
الثاني ُ sizeت حدد الحجم الجديد الذي يجب تخصيصه للذاكرة.
عند تنفيذ الدالة ،reallocيتم تغيير حجم المساحة المخصصة وإعادة تخصيصها .إذا كان هناك
مساحة كافية بعد المساحة المحجوزة الحالية ،فقد يتم توسيع المساحة في نفس الموقع.
وإذا كان هناك قلة في المساحة المحجوزة الحالية ،فقد يتم نقل المحتوى إلى مساحة جديدة
تم تخصيصها وتكون ذاكرة العناصر القديمة قد تم حرقها وتجاهلها.
ما يجب أن تعلمه هو أن البيانات الموجودة في المساحة التي لم يتم تعديلها ُت حافظ عليها
وال يتم تغييرها .يتم االحتفاظ بعدد البايتات غير المعدلة بواسطة الحجم الفعلي والحجم
الجديد ،وذلك لضمان عدم فقدان أو تغيير البيانات المهمة.
RPB - TEAM
>#include <stdio.h
>#include <stdlib.h
{ )(int main
//تخصيص مساحة ذاكرة لحفظ مصفوفة من األعداد الصحيحة
;))int *numbers = (int *)malloc(5 * sizeof(int
intتم تخصيص مساحة ذاكرة لـ 5عناصر من نوع //
//يمكننا القيام بالعمليات المطلوبة هنا
//تحجيم المساحة إىل 10عناصر من نوع int
;))numbers = (int *)realloc(numbers, 10 * sizeof(int
intتم تغيير حجم المساحة المخصصة إىل 10عناصر من نوع //
يمكننا القيام بالعمليات المطلوبة هنا //
اآلن يمكننا الوصول إىل المساحة الجديدة المحجوزة بعد التحجيم //
إلغاء تخصيص الذاكرة بعد االنتهاء من االستخدام //
;)free(numbers
} ;return 0
@RA'AD ABU JAISH