שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2023 - מעקב אחר קוד
(PersonFun) שאלה זו מתייחסת לקוד בנספח [Person]. בהרצת התכנית בקוד שלמטה, בעת הגעתנו לשורה המסומנת בכוכביות, מה ניתן לומר על תמונת הזיכרון מבחינת משתנים ועצמים? שימו לב כי ייתכנו עצמים ומשתנים נוספים מעבר למה שמצוין בכל אחת מן התשובות.
רמז: השאלה האם משתנים שמורים בזיכרון קשורה לתחום ההגדרה (scope) שלהם.
.1 בנקודה זו, שני המשתנים fun ו-input בוודאות שמורים בזכרון המחסנית (stack)
.2 בנקודה זו, המופע של Person בשם Jose בוודאות שמור בזיכרון הערימה (heap) וייתכן אך לא בטוח שהמופע של Person בשם Arcadio שמור אף הוא בזכרון הערימה
.3 בנקודה זו, שני המשתנים fun ו-input בוודאות אינם שמורים בזכרון המחסנית (stack)
.4 בנקודה זו, ייתכן אך לא בטוח ששני המופעים של Person בשם Jose ו- Arcadio שמורים בזיכרון הערימה (heap)
רמז: השאלה האם משתנים שמורים בזיכרון קשורה לתחום ההגדרה (scope) שלהם.
.1 בנקודה זו, שני המשתנים fun ו-input בוודאות שמורים בזכרון המחסנית (stack)
.2 בנקודה זו, המופע של Person בשם Jose בוודאות שמור בזיכרון הערימה (heap) וייתכן אך לא בטוח שהמופע של Person בשם Arcadio שמור אף הוא בזכרון הערימה
.3 בנקודה זו, שני המשתנים fun ו-input בוודאות אינם שמורים בזכרון המחסנית (stack)
.4 בנקודה זו, ייתכן אך לא בטוח ששני המופעים של Person בשם Jose ו- Arcadio שמורים בזיכרון הערימה (heap)
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד ב2023סמסטר ב
★★★★★
מעקב אחר קודאובייקטיםמחסניותערימותgarbage collection
חשבו מתי אובייקט הופך ללא-נגיש (unreachable), ומה המשמעות של כך מבחינת פעולתו הלא-דטרמיניסטית של אוסף הזבל (Garbage Collector).
התשובה הנכונה היא 4. ננתח את מצב הזיכרון צעד אחר צעד:
1. בתחילת הריצה של `main`: נוצר משתנה מקומי
2. בקריאה למתודה `doFun`: נוצר אובייקט חדש
3. בתוך `doFun`: נוצר אובייקט שלישי,
4. בסיום `doFun`: מסגרת המחסנית של
5. בשורה המסומנת ב-`/*/
6. תפקיד ה-GC: ה-GC פועל באופן לא-דטרמיניסטי. אנחנו לא יכולים לדעת מתי בדיוק הוא יפעל. ייתכן שהוא כבר פעל ופינה את האובייקט "Jose" (וגם את "Arcadio", שהפך ללא נגיש בעקבותיו), וייתכן שטרם פעל והאובייקטים עדיין קיימים פיזית בזיכרון הערימה.
לסיכום, מכיוון שלא ניתן להבטיח מתי ה-GC יפעל, לא ניתן לומר בוודאות שהאובייקטים עדיין קיימים. לכן, התיאור המדויק ביותר הוא שייתכן אך לא בטוח שהם שמורים בזיכרון הערימה. שאר האפשרויות שגויות:
* 1 ו-3 שגויות כי
* 2 שגויה כי לא ניתן לומר בוודאות שהאובייקט "Jose" שמור בזיכרון.
1. בתחילת הריצה של `main`: נוצר משתנה מקומי
fun על גבי זיכרון המחסנית (stack). משתנה זה מחזיק הפניה (reference) לאובייקט חדש מסוג Fun שנוצר על גבי זיכרון הערימה (heap).2. בקריאה למתודה `doFun`: נוצר אובייקט חדש
new Person("Jose") על הערימה. ההפניה לאובייקט זה מועברת כארגומנט למתודה. בתוך doFun, נוצר משתנה מקומי (פרמטר) חדש בשם input על המחסנית (בתוך מסגרת המחסנית של doFun). משתנה זה מקבל את ההפניה לאובייקט Person "Jose".3. בתוך `doFun`: נוצר אובייקט שלישי,
new Person("Arcadio"), גם הוא על הערימה. ההפניה אליו נשמרת בשדה כלשהו של האובייקט "Jose" (דרך המתודה setFirst).4. בסיום `doFun`: מסגרת המחסנית של
doFun נמחקת. כתוצאה מכך, המשתנה המקומי input מפסיק להתקיים.5. בשורה המסומנת ב-`/*/
**: חזרנו ל-main. המשתנה input כבר לא קיים. כעת, אין שום משתנה פעיל על המחסנית שמחזיק הפניה ישירה לאובייקט Person` "Jose". מכיוון שהאובייקט אינו נגיש יותר (unreachable) משורשי התוכנית (כמו המחסנית), הוא הופך להיות מועמד לפינוי על ידי אוסף הזבל (Garbage Collector - GC).6. תפקיד ה-GC: ה-GC פועל באופן לא-דטרמיניסטי. אנחנו לא יכולים לדעת מתי בדיוק הוא יפעל. ייתכן שהוא כבר פעל ופינה את האובייקט "Jose" (וגם את "Arcadio", שהפך ללא נגיש בעקבותיו), וייתכן שטרם פעל והאובייקטים עדיין קיימים פיזית בזיכרון הערימה.
לסיכום, מכיוון שלא ניתן להבטיח מתי ה-GC יפעל, לא ניתן לומר בוודאות שהאובייקטים עדיין קיימים. לכן, התיאור המדויק ביותר הוא שייתכן אך לא בטוח שהם שמורים בזיכרון הערימה. שאר האפשרויות שגויות:
* 1 ו-3 שגויות כי
fun בוודאות על המחסנית, ו-input בוודאות לא על המחסנית.* 2 שגויה כי לא ניתן לומר בוודאות שהאובייקט "Jose" שמור בזיכרון.