לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #2  
ישן 08-07-2008, 17:35
  sigsig sigsig אינו מחובר  
 
חבר מתאריך: 23.11.07
הודעות: 187
בתגובה להודעה מספר 1 שנכתבה על ידי EthanDarkWarrior שמתחילה ב "שאלה-הקצאה ושחרור של זיכרון"

חשוב להבין איך עובד ה-GC כדי לענות לך על השאלה: רק אובייקטים שלא נמצאים בשימוש ישוחררו. הכוונה ב-'לא נמצאים בשימוש' היא שאין אליהם REFERENCE משום מקום אחר בתוכנית (כלומר, אין בשום מקום אחר בזיכרון הפנייה לכתובת שלהם). יש גם מקרים יוצאי-דופן (מה שנקרא WEAK REFERENCE) שכרגע אני מתעלם מהם.

ולתשובות:
א. אם במקום אחר בתוכנית יש הפנייה לאחד האובייקטים שנמצא במערך - הוא לא ישתחרר. אם אין - הזיכרון ישתחרר בשלב כלשהוא.
ב. אותה תשובה. ההקצאה למערך החדש תתבצע במקום אחר בזיכרון, ודין הזיכרון הישן ככל זיכרון שלא בשימוש.
ג. אתה יכול להפעיל GC בצורה יזומה (חפש את מתודת Collect על המחלקה GC), אבל לא מומלץ לעשות את זה, מפני שאתה מבלבל את הסטיסטיקה שה-GC אוסף עבור התוכנית שלך. אולי בטווח הזמן הקצר זה יעזור, לאורך זמן לתוכנית שלך תהיינה יותר בעיות זיכרון אם תעשה את זה. בכל מקרה - זה לא עובד כמו ב-++C, כי ה-finalizers (מה שמוכר כ-destructors ב-++C) רצים על THREAD נפרד. המלצה שלי - לא זו היא הדרך לטפל בבעיות זיכרון.
ד. JAGGED ARRAY הוא בעצם ARRAY, שמחזיק אובייקטים שהם ARRAYS בעצמם. אין הבדל מהותי בינו לבין מערך של אובייקטי REFERENCE אחרים.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #4  
ישן 11-07-2008, 08:31
  sigsig sigsig אינו מחובר  
 
חבר מתאריך: 23.11.07
הודעות: 187
בתגובה להודעה מספר 3 שנכתבה על ידי EthanDarkWarrior שמתחילה ב "תודה רבה!"

תניח שהקצאת איפהשהוא בתוכנית שלך 5 אובייקטים, שנקראים object1 עד object5. נתון הקוד הבא:

קוד:
object[] objectArray = new object[] {object1, object2, object3, object4, object5}; DoSomethingWith(object1); DoSomethingWith(object2); object[] newObjectArray = new object[] {object3, object4, object5};


במצב כזה ישתחרר הזיכרון עבור אובייקט המערך objectArray, אבל הזיכרון עבור object1 ו-object2 ישאר, כי יש reference אליהם מתוך המתודה DoSomethingWith. יוקצה גם זיכרון חדש עבור האובייקט newObjectArray, וממנו יהיה reference ל-object3 עד object5 כך שגם הם לא ישתחררו.
שים לב אבל, שעצם זה שאין reference לאובייקט כלשהוא לא מחייב שה-GC ירוץ מיידי - זה ההבדל המהותי בין מה שאתה מכיר מ-++C ל-NET. רק מתי שיהיה לחץ במשאבי הזיכרון הזמין ה-CLR יחליט להריץ את ה-GC ולהיפטר מהאובייקטים האלה. בהחלט יכול להיות, לדוגמא, שבתוכנית הנ'ל לא ירוץ GC בשום שלב, ולכן לא ישתחרר זיכרון בכלל למרות שיש אובייקטים שאפשר להיפטר מהם.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 08:54

הדף נוצר ב 0.03 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2025 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר