سؤال

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

على سبيل المثال, العديد من اللغات تؤدي بهم إدارة الذاكرة ، مثل Java و Perl, لا تخضع إلى تجاوزات المخزن المؤقت.لغات أخرى ، مثل ادا و C# ، وعادة ما توفر تجاوز الحماية ، ولكن الحماية يمكن تعطيل من قبل مبرمج.

لم أكن على علم بأن Java و C# اختلف في أي طريقة مجدية فيما يتعلق إدارة الذاكرة.كيف جافا لا تخضع عازلة الفيضانات ، في حين C# يحمي فقط ضد تجاوزات?و كيف يمكن تعطيل هذه الحماية في C# ؟

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

المحلول

جافا لا يدعم الخام المؤشرات (بالمعنى الدقيق للكلمة لا يدعم المؤشر الحسابي).

في C#, يمكنك استخدام تعليمات برمجية غير آمنة و مؤشرات, و غير المدارة الذاكرة ، مما يجعل المخزن المؤقت تجاوز ممكن.انظر غير آمنة الكلمات الرئيسية.

للحفاظ على النوع السلامة والأمن ، C# لا تدعم المؤشر الحساب بشكل افتراضي.ومع ذلك ، استخدام غير الكلمة ، يمكنك تعريف غير آمنة السياق الذي مؤشرات يمكن استخدامها.لمزيد من معلومات حول المؤشرات ، انظر الموضوع مؤشر أنواع.

نصائح أخرى

إجابات جيدة.وأود أن أضيف أن جافا يعتمد على استخدام المكدس أو كومة مواقع الذاكرة.C# لا فضلا.فكرة استخدام الخام المؤشرات إضافة إلى C# التي تأتي من التعليمات البرمجية C الخلفية.على الرغم من أن C# و C / C++ ليست نفس رمز اللغة أنها تشترك في بعض السمات المشتركة دلالات.فكرة استخدام "غير آمنة" كود يسمح لك لتجنب حفظ الأجسام الكبيرة على كومة حيث الذاكرة محدودة إلى حوالي 2 جيجابايت في وقت سبيل المثال (C# في CLR, جافا في JVM سبيل المثال) دون تكبد درامية تدهور الأداء بسبب جمع القمامة.في بعض الحالات يمكنك استخدام C#'s القدرة على النفوذ غير آمنة أو يدويا تمكنت الذاكرة مؤشرات حول الواقع ليس هناك بالقرب من العديد من أدوات طرف ثالث من أجل مشاكل التخزين المؤقت خارج الكومة.

أود أن نحذر من أن إذا كنت تستخدم التعليمات البرمجية غير آمن تأكد من الحصول على دراية "المتاح أنواع" و "Finalizers".هذا يمكن أن يكون بدلا ممارسة متقدمة وتداعيات عدم التخلص من الأشياء الخاصة بك بشكل صحيح هو نفسه كما هو الحال مع التعليمات البرمجية C ...اللعين تسرب الذاكرة.تداعيات نفاد الذاكرة التطبيق الخاص بك و يسقط على (غير جيد).هذا هو السبب في C# لا يسمح بذلك بشكل افتراضي و التي تحتاج إلى تجاوز أي استخدام التحكم يدويا المؤشرات مع "غير آمنة" الكلمة.هذا يضمن أن أي يدويا التعامل مع الذاكرة هو مقصود.ضع ج-رمز القبعة عند التعامل مع "غير آمنة" الكلمة.

مرجع كبير أن هذا كان في الفصل "فهم الكائن عمر" في "برو C# 2010 .صافي منصة" أندرو Troelsen.إذا كنت تفضل على الانترنت المراجع راجع موقع MSDN تنفيذ اللمسات الأخيرة والتخلص لتنظيف الموارد غير المدارة

ملاحظة أخيرة واحدة - غير المدارة الذاكرة صدر في finalizer جزء من الكائن (~ObjectName(){...}).هذه الأنماط إضافة النفقات العامة إلى الأداء حتى إذا كنت تتعامل مع انخفاض الكمون سيناريوهات قد تكون أفضل طريق الحفاظ على الأشياء الخفيفة.إذا كنت تتعامل مع الإنسان استجابة ثم يجب عليك أن تنظر هذه عند الضرورة القصوى.

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