هل هناك حاجة للتحقق من NULL بعد تخصيص الذاكرة، عندما تستخدم Kernel ذاكرة OverCommit

StackOverflow https://stackoverflow.com/questions/2248995

  •  20-09-2019
  •  | 
  •  

سؤال

من الممارسات العامة التحقق من وجود NULL (سواء تم تخصيص الذاكرة بنجاح) بعد malloc ()، شيء مثل

void *ptr = malloc(10);    
if (ptr != NULL) {  
  // do some thing usefull  
} else {  
 // no memory. safely return/throw ...  
}  

مع تمكين OverCommit في الذاكرة في Kernel، هل هناك فرصة للحصول على NULL؟ يجب أن أتابع ممارسة التحقق من دينيا لاغيا لكل تخصيص؟ هل سيعود Malloc Null Inspite آلية OverCommit المكثف (أعتقد القيمة 1)؟

على سبيل الواقع، يستخدم Android Kernel overcommit الذاكرة (غير متأكد من القيمة، وأحب أن يعرف ذلك (القيمة المفرطة) وأهميته). لا يتحقق بعض رمز مصدر الإطار (C / C / C ++) في نظام Android (قد يكون الطرف الثالث) عن Null أو catch bad_alloc بعد التخصيصات. هل فاتني شيء؟

هناك بعض المواضيع في ذلك بخصوص الذاكرة الزائدة، ولكن لا شيء منهم حل ارتباك.

تعديل: إذا تم استخدام OverCommit العدواني NULL لن يتم إرجاعه (الافتراض 1). عندما لا تكون هناك ذاكرة مادية متوفرة ومحاولة محاولة الوصول إلى الذاكرة المخصصة (الكتابة إلى الذاكرة المخصصة)، ستقتل OOM بعض العملية وتخصص الذاكرة للتطبيق حتى يقتل بدوره (الافتراض 2). في كلتا الحالتين، لا أرى أي حاجة إلى التبخير NULL (الذاكرة المخصصة أو العملية السرية). هل أنا على حق في افتراضاتي؟
القدرة ليست مصدر قلق لهذا السؤال.

هل كانت مفيدة؟

المحلول

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

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

نصائح أخرى

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

معظم البرامج مكتوب بشدة ولا تحتوي على جميع الشيكات.

Malloc لا يمكن أن يعود شيئا آخر غير فارغ أو مؤشر. الكل أو لا شيء. لا يمكنك الحصول على 1 بايت من malloc إذا طلبت 10.

سيكون من المستحسن التحقق من عدم وجود ديني عبر جميع المهام المكالمات التي قد تعود لاغيا، بغض النظر عما إذا كانت النواة لديها ذاكرة تزيد عنها أم لا.

يظهر هذا الجزء التالي من الكود أدناه كيفية التحقق مما إذا كانت المكالمة malloc عملت أم لا ...

باطل * ptr = malloc (10)؛ إذا كان (ptr! = null) {/ * افعل شيئا هنا مع PTR * /} آخر {/ * افعل شيئا هنا إذا فشل * /}

عمليات الملفات، عمليات الذاكرة إلى الاسم ولكن عدد قليل سيعود فارغة عند الفشل.

نأمل أن يساعد هذا، مع أطيب التحيات، توم.

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

لا، ليست هناك حاجة للتحقق من نتيجة malloc.

منذ فترة طويلة قبل فشل malloc، كان نظام التشغيل قد واجه بالفعل الكثير من المشاكل.

سيكون "القاتل Oom-killer و overcommit" هو اختيار أفضل.

لما؟ نظام التشغيل الخاص بك لا يدعم "القاتل Oom-Killer و OverCommit"؟

هذا هو السبب في أن يجب عليك التبديل إلى Linux (أو Android)!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top