
_START_ARTICLE_
تسرب الذاكرة
_START_PARAGRAPH_
في علوم الحاسب، يعتبر تسرب الذاكرة نوع من الاستهلاك غير المتعمد للذاكره المؤقتة "ram" في الحاسوب، بواسطة برنامج حاسوب، حيث يفشل البرنامج في إفراغ الذاكرة بعد الانتهاء من استخدامها، ويرى بالمصطلح نوع من الخطا المرح في التسمية، لأن الذاكرة لا تفقد بطبيعة الحال من الحاسوب، ولكنها تصبح مشغوله ويتم تجاهلها بسبب خطأ تقني في عمليات البرنامج المنطقيه._NEWLINE_وكما يشار بالأسفل، يوجد لتسرب الذاكرة العديد من الأعراض المتشابهه مع أعراض مشاكل أخرى، وعامة لا يمكن تحليل سبب تلك الاعراض الا بواسطة مبرمج حاسوب لديه وسيله لرؤية المصدر الكودي للبرنامج، ومع ذلك فأغلب الناس يسارعون إلى وصف أي زياده غير مرغوبه في استخدام الذاكرة بتسرب للذاكره، حتى ولو لم يكن ذلك دقيقا.
_START_SECTION_
مثال لشخص عادي
_START_PARAGRAPH_
هذا المثال يهدف لتوضيح كيفية حدوث تسرب بالذاكره، ونتائجه، بدون الحاجة إلى اي معرفه بعلم البرمجه. يرجى ملاحظة ان هذا مثال توضيحي._NEWLINE_البريمج في هذه الحالة هو جزء من برنامج بسيط جدا مصمم للتحكم في مصعد، هذا الجزء من البرنامج ينفذ حينما يدخل أي شخص المصعد ويضغط على زر طابق معين للصعود اليه._NEWLINE_حين يضغط على زر:_NEWLINE_   احصل على بعض الذاكرة، والتي سوف تستخدم لتذكر رقم الطابق المراد الصعود اليه._NEWLINE_   أحفظ رقم الطابق في الذاكرة_NEWLINE_   هل نحن بالفعل في الطابق المراد؟_NEWLINE_   إذا كنا كذلك، ليس لدينا شيء لنفعله: انتهى_NEWLINE_   إذا لم يكن كذلك:_NEWLINE_        انتظر حتى يغلق المصعد_NEWLINE_        اذهب إلى الطابق المطلوب_NEWLINE_        افرغ الذاكرة التي استخدمت في تذكر رقم الطابق_NEWLINE_قد يبدو هذا البريمج بسيطا بشكل كاف، ولكنه لديه بالفعل تسرب ذاكره، فلنعتبر ان المصعد كان في الطابق رقم 3، حين يتم الضغط على الزر 3، نحجز جزء من الذاكرة، ولا نعيده أبدا. وفي كل مرة يحدث كذلك، نسرب المزيد من الذاكرة._NEWLINE_لن يكون لذلك تأثير مباشر، فغالبا لا يضغط الناس على زر الدور الذين يوجدوا فيه بالفعل، وفي جميع الأحوال، يمكن ان يكون للمصعد الكثير من الذاكرة الفارغه فيحدث ذلك مئات أو آلاف المرات، لكن أخيرا سوف تنفد ذاكرة المصعد، قد يأخذ هذا شهورا أو سنينا، لذلك يمكن عدم اكتشاف الخطاء حتى تخت أدق الاختبارات._NEWLINE_قد تكون النتائج أيضا غير جيده، فقد ينتهي الأمر بالمصعد إلى عدم الإستجابه لطلبات الصعود لأدوار أخرى، وإذا كان المصعد يحتاج إلى ذاكره لفتح الباب أيضا، فقد يحبس شخصا ما بداخل المصعد، لأنه لا توجد ذاكره كافيه ليتم فتح ذلك الباب._NEWLINE_لاحظ أن التسرب لا يمكن ان يستمر الا إذا استمر البرنامج يعمل، كمثال، إذا انقطع التيار الكهربي فجأه عن المصعد، عندها عندما يعود التيار ستكون الذاكرة فارغه تماما ومتوفره من جديد، حينها سيكون على عملية التسرب البطيئه البدء من جديد.
_START_SECTION_
هل هو تسرب بالذاكره؟
_START_PARAGRAPH_
لاحظ ان ارتفاع مساحة الذاكرة المستخدمة ليس بالضروره دليل على تسرب بالذاكره، فبعض البرامج قد تخزن كميات من المعلومات تتطور دائما في الذاكرة، (مثال: مثل في الخابية cache). إذا أمكن تمدد الكاش بشكل كبير بحيث تسبب مشاكل، قد يكون ذلك بسبب خطاء تصميمي أو برمجي، ولكن ليس تسرب ذاكره، حيث أن المعلومات المخزنه تظل بشكل ضئيل مستخدمه. وفي بعض الحلات الأخرى، قد يطلب برنامج مساحة كبيره جدا من الذاكرة بدون سبب، وذلك لان المبرمج قد اعتبر ان الذاكرة دائما كافيه لعملية ما، كمثال، قد يبدء برنامج معالجة صور بقراءة كل محتويات الصورة وتخزينها في الذاكرة، وهذا شيء لا يتماشى مع أي صورة كبيرة جدا تتجاوز مساحتها مساحة الذاكرة المتوفره._NEWLINE_لتوضيح ذلك أكثر، فإن تسرب في الذاكرة ينتج عن نوع محدد من الأخطاء في الكود البرمجي، وبدون وسيله لرؤية الكود البرمجي، لا يستطيع أي شخص سوى الجزم بأن السبب يمكن أن يكون تسربا بالذاكره، ويكون من الأفضل استخدام مصطلح "زياده مستمره في استهلاك الذاكرة المستخدمة" حينما لا توجد معرفه بالسبب الحقيقي._NEWLINE_ان مصطلح "تسرب الذاكرة" هو مستسهل بعض الشيء وقد يتعلق به غير المبرمجين خاصة ويستخدموه في حالات للذاكره ليس لها اي علاقه بتسرب الذاكرة.
_START_SECTION_
مثال بسيط لذاكره لا يمكن الوصول إليها في لغة سي
_START_PARAGRAPH_
هنا بريمج بلغة سي يتعمد تسريب الذاكرة عن طريق فقد المؤشر للذاكره الموزعه، ولأن البريمج يستمر في العمل دائما باستدعاء الوظيفة الناقصه في الكود، فبالنهايه سيتوقف البرنامج عن العمل عندما لا تتوفر مساحه بالذاكره فارغه._NEWLINE_#include <stdio.h>_NEWLINE_int f(void) _NEWLINE_{ _NEWLINE_    char* s; _NEWLINE_    s = (char *)malloc(50); /* get memory */ _NEWLINE_    if (s==NULL) return 1; /* no memory available */ _NEWLINE_    else _NEWLINE_    {   /* memory available */ _NEWLINE_        return 0;  /* memory leak - see note below */ _NEWLINE_    } _NEWLINE_    /* _NEWLINE_     * Memory was available and pointed to by s، but not saved. _NEWLINE_     * After this function returns، the pointer is destroyed، _NEWLINE_     * and the allocated memory becomes unreachable _NEWLINE_     * _NEWLINE_     * to "fix" this code، you would add the statement "free(s)" to _NEWLINE_     * the else block before the "return 0" statement _NEWLINE_     */ _NEWLINE_} _NEWLINE_int main(void) _NEWLINE_{ _NEWLINE_    /* this is an infinite loop calling the above function */ _NEWLINE_    while (1) f(); /* This function call will fail to malloc sooner or later */ _NEWLINE_return 0 ; _NEWLINE_}