سؤال

هل هناك أي نقطة إلى تحرير الذاكرة في وظيفة atexit ()؟

ولدي المتغير العالمي الذي يحصل malloc'ed بعد بدء التشغيل. يمكنني أن أكتب وظيفة atexit () لتحرير ذلك، ولكن ليس على نظام الذهاب لاستعادة كل تلك الذاكرة عند إنهاء البرنامج على أية حال؟

هل هناك أي فائدة لكونها مرتبة وبنشاط تنظيفه نفسي؟

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

المحلول

وليس في C - انها مثل إعادة ترتيب الكراسي على سطح السفينة بينما السفينة تغرق حولك

.

في C ++ كان الجواب مختلفة، لأن الأشياء يمكن حذف الملفات المؤقتة وهكذا دواليك في تالفة، لذلك كنت بحاجة للتأكد من الحصول على استدعاء تلك.

نصائح أخرى

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

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

وحين إذا كنت إنهاء دون free()ing، ترحيلها البيانات إلى القرص يمكن أن يموت في سلام.

وبالطبع free()ing في أوقات أخرى عادة ما تكون مفيدة لمزيد من malloc()s يمكن إعادة استخدام المساحة التي حررت وحتى free() قد unmap بعض الذاكرة التي يمكن استخدامها من قبل عمليات أخرى.

في جميع أنظمة التشغيل الحديثة، يمكنك الافتراض أن كل ذاكرة ستتحرر عندما يتم إنهاء البرنامج.

ويجري في الواقع مرتبة يمكن أن تكون مثيرة للاهتمام عندما القوات evolves.It البرنامج لك لإرسال وظيفة تنظيف عند إنشاء وظائف "initialisation". وتأتي هذه الفائدة عندما يصبح البرنامج أكثر تعقيدا، وكنت ترغب في إعادة تشغيل جزء من البرنامج. إذا كنت قد قمت بالفعل كتب العمل وظائف تنظيف، فإنه من غير المحتمل أن كنت قد نسيت فجأة بعض تنظيف عندما "إعادة تشغيل" جزء من البرنامج.

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

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

ويجب تحرير () إذا التعليمات البرمجية التي المتصل atexit () هو جزء من مكتبة مشتركة تحميلها بشكل حيوي (مع dlopen ()، على سبيل المثال). في هذه الحالة سوف يتم استدعاء معالج atexit في dlclose) وقت (حتى كومة سوف تستمر في الوجود لبقية عملية الاستخدام.

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

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

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