ما هو تسرب الذاكرة في البرمجة سي

Ma Hw Tsrb Aldhakrt Fy Albrmjt Sy



تتضمن أساسيات البرمجة إدارة الذاكرة ، خاصةً في لغات مثل لغة سي بدون أداة تجميع القمامة المدمجة. تسريبات الذاكرة مشكلة شائعة في مثل هذه اللغات ، وتتسبب في استهلاك البرنامج المزيد والمزيد من الذاكرة حتى يتعطل البرنامج بسبب نقص الذاكرة. عندما يفشل برنامج ما في تحرير الذاكرة التي لم تعد مطلوبة ، يتم تخصيص الذاكرة وعدم استخدامها ، مما ينتج عنه ملف تسريب ذاكرة .

متى يحدث تسرب للذاكرة؟

بعد أن يقوم البرنامج بتخصيص الذاكرة ولكن لا يقوم بتحريرها بعد انتهائها ، يوجد ملف تسريب ذاكرة . هذا يعني أن البرنامج يستمر في تخصيص المزيد والمزيد من الذاكرة للمتغيرات الجديدة مع ترك الذاكرة القديمة المخصصة وغير المستخدمة. ينتج عن هذا استخدام البرنامج المزيد والمزيد من الذاكرة ، وفي النهاية ، يتعطل البرنامج بسبب خطأ نفاد الذاكرة.

آثار تسرب الذاكرة في C.

تسريبات الذاكرة يمكن أن يسبب الكثير من المشاكل في البرنامج. إذا تركت دون رادع ، أ تسريب ذاكرة يمكن أن يتسبب في تعطل البرنامج أو إيقاف تشغيله ، مما قد يؤدي إلى فقد البيانات أو تلفها. علاوة على ذلك ، نظرًا لأن البرنامج يستهلك ذاكرة أكثر مما يحتاج إليه ، فقد يؤثر ذلك على أداء النظام وقد يؤدي إلى إبطاء البرامج الأخرى التي تعمل على نفس النظام.







تخصيص الذاكرة بلغة سي

يتم تنفيذ تخصيص الذاكرة باستخدام ملف مالوك () تعمل في لغة سي. تعيد هذه الطريقة إشارة إلى كتلة ذاكرة بالحجم المحدد. يتم استخدام قيمة المؤشر للوصول إلى كتلة الذاكرة المخصصة. بمجرد عدم الحاجة إلى الذاكرة ، يجب تحريرها باستخدام امتداد حر() وظيفة.



أسباب تسرب الذاكرة

بعض أسباب تسريبات الذاكرة نكون:



1: إدارة غير صحيحة للذاكرة

السبب الأكثر شيوعًا لتسرب الذاكرة هو ضعف إدارة الذاكرة من جانب المبرمج. يحدث هذا عندما يتجاهل أحد البرامج تحرير ذاكرة لم تعد مطلوبة.





# تضمين
# تضمين

int رئيسي ( )
{
int * ptr = ( int * ) مالوك ( حجم ( int ) ) ؛
* ptr = 10 ؛
printf ( '٪د ' و * ptr ) ؛
ptr = باطل ؛
يعود 0 ؛
}

في الكود أعلاه ، باستخدام مالوك () الطريقة في ptr المؤشر ، خصصنا مساحة لكتلة ذاكرة عدد صحيح. ال ptr تتغير قيمة المؤشر عندما نقوم بتعيين باطل ومع ذلك ، لم يتم تحرير كتلة الذاكرة التي كانت تشير إليها سابقًا. لذلك ، أ تسريب ذاكرة سوف ينتج.

انتاج |



2: مؤشر خارج النطاق

عندما يوجد متغير المؤشر في نطاقه ، أ تسريب ذاكرة يحدث في برامج C.

# تضمين
# تضمين

int رئيسي ( )
{
int عدد 1 = 32 ، العدد 2 = 23 ؛
{
int * مجموع = ( int * ) مالوك ( حجم ( int ) ) ؛
* مجموع = عدد 1 + عدد 2 ؛
printf ( '٪د ' و * مجموع ) ؛
}
printf ( '٪د ' و * مجموع ) ؛
يعود 0 ؛
}

في برنامج C أعلاه ، فإن رئيسي() تستخدم الدالة نطاقًا محليًا لتخصيص كتلة ذاكرة عدد صحيح إلى مجموع متغير المؤشر. منذ أن استخدمنا مجموع مؤشر لتعيين إضافة a و b إلى كتلة الذاكرة المشكلة حديثًا ، يتم تخصيص كتلة الذاكرة باستمرار حتى بعد انتهاء نطاق الكتلة. لذلك ، أ تسريب ذاكرة سوف يحدث.

انتاج |

كشف تسربات الذاكرة في ج

الكشف والوقاية من تسريبات الذاكرة ضرورية للحفاظ على استقرار البرنامج وأدائه. للكشف عن تسريبات الذاكرة ، يمكن للمبرمجين استخدام أدوات مثل بوابة الانتخابات ، أداة لتصحيح أخطاء الذاكرة والتوصيف. بوابة الانتخابات يساعد في تحديد تسرب الذاكرة من خلال تتبع جميع عمليات الوصول إلى الذاكرة في البرنامج وتحديد متى لا يتم تحرير الذاكرة المخصصة.

منع تسرب الذاكرة في C.

كى تمنع تسريبات الذاكرة ، اتبع التعليمات الموضحة أدناه.

1: حرر الذاكرة المخصصة دائمًا
يجب دائمًا تحرير الذاكرة بشكل صريح باستخدام ملف حر() طريقة بعد أن تم تخصيصها ديناميكيًا باستخدام دالة مثل malloc () أو calloc () أو realloc () . من خلال القيام بذلك ، يتم التأكد من إرجاع الذاكرة إلى النظام وأنها متاحة للاستخدامات الأخرى.

2: مراقبة الذاكرة المخصصة
تعد مراقبة الذاكرة المخصصة أمرًا مهمًا للتأكد من تحريرها عندما لم تعد مطلوبة. يمكن تحقيق ذلك من خلال تتبع كل ذاكرة تم تخصيصها وإطلاقها عندما لا تكون هناك حاجة إليها.

3: تتبع المؤشرات
يجب تتبع المؤشرات لإدارة تخصيص الذاكرة وإلغاء تخصيصها تلقائيًا ، مما يمنع تسرب الذاكرة.

4: استخدام أدوات التحليل الثابت
في وقت الإنشاء ، يمكن لأدوات التحليل الثابت تحديد ما هو ممكن تسريبات الذاكرة في برامج C ، مثل Clang و GCC. قبل تشغيل التطبيق ، يمكن أن تساعد هذه الأدوات في تحديد مكان تسرب الذاكرة المحتمل وتقديم اقتراحات التصحيح.

يوضح المثال التالي العملية المذكورة أعلاه.

# تضمين
# تضمين
# تضمين

int رئيسي ( )
{
int * ptr = ( int * ) مالوك ( حجم ( int ) ) ؛
لو ( ptr == باطل ) {
printf ( 'خطأ في تخصيص الذاكرة. ' ) ؛
يعود 1 ؛
}
* ptr = 10 ؛
printf ( '٪د ' و * ptr ) ؛
حر ( ptr ) ؛
يعود 0 ؛
}

يحدد هذا الرمز أعلاه أولاً ما إذا كان تخصيص الذاكرة ناجحًا عن طريق التحقق لمعرفة ما إذا كان ملف ptr المرجع ليس كذلك باطل . قد يعالج الرمز الخطأ بشكل مناسب إذا فشل التخصيص. إذا كان التخصيص ناجحًا ، فإن الكود يعطي كتلة الذاكرة قيمة 10 ويخرجها. بعد ذلك ، يقوم الكود بتحرير الذاكرة التي تم تخصيصها باستخدام ملف حر() وظيفة.

انتاج |

خاتمة

تسريبات الذاكرة يمكن أن يسبب مشاكل كبيرة في البرامج ، بما في ذلك تدهور الأداء والأعطال. يمكن تحديد مثل هذه المشكلات ومنعها من خلال الإدارة الدقيقة للذاكرة والاختبار المناسب ومراقبة استخدام الذاكرة. على هذا النحو ، يجب أن يكون المبرمجون على دراية باحتمالية تسرب الذاكرة ويجب عليهم اتخاذ الخطوات اللازمة لمنعها.