السلوك غير الواضح للمؤشر ثابت خارج بيان ثابت

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

  •  21-08-2019
  •  | 
  •  

سؤال

ويمكن للشخص أن يفسر لي لماذا لا يتعطل أدناه C # رمز؟ لماذا البصرية ستوديو تسمح في الواقع لتجميع ذلك؟ ما أفهمه هو أن أنا على الحصول على مؤشر ثابت، ولكن تم إصلاحه إلا في بيان "ثابتة". عندما يتم إرجاع المؤشر من وظيفة "فو"، ومجموعة "ع" قد تجمع. I ثم فرض GC ان يفعل ذلك، ولكن الكتابة متتالية لذكرى (والذي هو الآن يتم deallocated) لا يسبب أي خطأ.

class Program
{
    static unsafe byte* Foo()
    {
        byte[] ar = new byte[100];
        fixed (byte* ptr = ar)
        {
            return ptr;
        }
    }

    static unsafe void Main(string[] args)
    {
        byte* ptr = Foo();
        GC.Collect();
        for (int t = 0;;++t) ptr[t%100] = 0;
    }
}
هل كانت مفيدة؟

المحلول

واريك هو الصحيح، ولكن الجواب ربما كنت أريد أن أسمع أن "أحيانا يكون من المفيد أن تحتفظ عنوان خارج بيان ثابت".

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

وقال ذلك، كنت آمل أن CodeAnalysis أو غيرها من الأدوات المتقدمة أن تتدخل هنا حيث المترجم هو السماح لك قطع قدمك الخاصة.

نصائح أخرى

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

وبطبيعة الحال، وذلك باستخدام مؤشر خارج كتلة ثابتة لأنه هو جدا فكرة سيئة - لا تفعل ذلك

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