عندما متغير يخرج من نطاق هذا يعني أنه غير موجود ؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

أنا لست متأكدا من أنني أفهم نطاق - لا تخرج من نطاق متغير (أنا باستخدام روبي) موجودة في الذاكرة في مكان ما أو أنها لا تتوقف القائمة (وأنا أعلم أنك لا يمكن الوصول إليها). سيكون من غير الدقيق القول أن الخروج من نطاق متغير لا توجد أي أكثر من ذلك ؟

ربما هذا هو السؤال الفلسفي.

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

المحلول

إذا كنت تستخدم لغة المدارة ثم لا تخصيص unallocate الذاكرة بقدر ما كنت قلقا أنه لم يعد موجودا.

من الناحية الفنية انها لا بل GCs لا تميل إلى أن تكون حتمية لذلك من الناحية الفنية فإنه من الصعب القول متى يختفي.

نصائح أخرى

متغير ليس هو نفس القيمة التي يحمل.

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

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

عندما متغير يقع خارج نطاق أي شخص أن يسمع ذلك الصراخ ؟

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

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

يمكن أن يكون أكثر تعقيدا من ذلك ، اعتمادا على كيفية جمع القمامة يعمل, لكنه قريب بما فيه الكفاية :)

كان موجودا قليلا حتى جمع القمامة يتصرف في ذلك (إذا كان يمكن).

روب كينيدي هذا الرد بشكل مناسب ، ولكن فكرت في إضافة أكثر من ذلك بقليل من التفصيل.

الشيء المهم أن ندرك الفرق بين متغير القيمة التي تمثلها.

هنا مثال (في C# لأنني لا أعرف روبي):

object c = null;
if (1 == 1) // Just to get a different scope
{
    var newObj = new SomeClass();
    newObj.SomeProperty = true;
    c = newObj;
}

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

إذا كنت تتحدث عن الملف الكائنات ، يصبح أكثر من سؤال فلسفي.إذا كنت أتذكر بشكل صحيح ، ملفات لا تغلق تلقائيا عندما يخرجون من نطاق - إلا أنها قريبة إذا كنت أطلب منهم أن إغلاق, أو إذا كنت تستخدم File.open do |file| نمط كتلة ، أو إذا حصلوا على القمامة التي تم جمعها.هذا يمكن أن يكون مشكلة إذا كان رمز آخر (أو وحدة الاختبارات) في محاولة لقراءة محتويات هذا الملف و لم يتم مسح.

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