ABA


"שחרור זיכרון בC"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #8457 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 8457
Michael

דרג אמינות חבר זה
   19:02   03.12.02   
אל הפורום  
  שחרור זיכרון בC  
 
   אני כותב תוכנית שמקצא זיכרון בצורה דינאמית,
לאחר שאני משתמש בזיכרון הזה אני רוצה לשחרר אותו
ולכן אני משתמש בפונקציה free אבל הזיכרון לא משתחרר
הוא נשאר, אז אני רוצה לדעת איך אפשר לשחררו

הנה דוגמא:
http://rotter.net/User_files/nor/3dece3896742d9b4.txt

משהו יכול להסביר לי למה הזיכרון לא משתחרר


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  אני לא מבין מה הבעייה שלך... Dudenland 03.12.02 19:32 1
     אז זהו Michael 03.12.02 21:29 2
         אתה סובל מחוסר הבנה של רעיון שחרור הזכרון. dryice 03.12.02 21:48 3
             ...ואם כבר הרחבת... Dudenland 04.12.02 00:33 4

       
Dudenland

דרג אמינות חבר זה
   19:32   03.12.02   
אל הפורום  
  1. אני לא מבין מה הבעייה שלך...  
בתגובה להודעה מספר 0
 
   הכל עובד טוב...

יכול להיות שיש בעייה בקומפיילר.
תכתוב מה הקומפיילר כותב לך בשגיאה...ומה הוא כותב לך בפלט...

אצלי, הפלט הוא:

Test
X


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Michael

דרג אמינות חבר זה
   21:29   03.12.02   
אל הפורום  
  2. אז זהו  
בתגובה להודעה מספר 1
 
   שאצלי הפלט הוא :
Test
Test

אני משתמש בBc3.1
ובמה אתה משתמש ?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

דרג אמינות חבר זה
   21:48   03.12.02   
אל הפורום  
  3. אתה סובל מחוסר הבנה של רעיון שחרור הזכרון.  
בתגובה להודעה מספר 2
 
   גם לאחר שמשחררים את הזכרון, אין שום סיבה
שתוכן אותו זכרון ישתנה, בקריאה free(p)
ברור שp לא משתנה,בC הכ עובר BY VALUE
וודאי אין שום סיבה שהמחשב יכתוב משהוא מיד לזכרון
המשוחרר(זה סתם יגזול זמן)

הפקודה free אומרת למערכת ההפעלה, אני עם הזכרון הזה
לא משתמש יותר, אתה למעשה מתחייב לא להשתמש יותר עם
הזכרון הזה, לא לקרוא אותו וודאי לא לכתוב אליו,
ניסיון כזה, סביר שיצליח, אך בתוכנית גדולה,
סביר שיגרום לבאגים עצבניים ברחבי התוכנית שלא תבין
מאיפה הם נפלו עליך.
מרגע ששיחררת בלוק מסוים בזכרון, מערכת ההפעלה רשאית
להקצות לך שוב את אותו בלוק או חלק ממנו או הבלוק כחלק
מבלוק גדול יותר.
אם אתה משחרר בלוק זכרון ואילו ממשיך להשתמש בו,
ומבקש במקום אחר לחלוטין בתוכנית להקצות בלוק זכרון שוב,
בהחלט יתכן שתהיה חפיפה בין הבלוקים, ולכן אתה תציב ערך למשתנה
אחד, ופתאום משתנה אחר לכאורה לא קשור משתנה לערך
חסר משמעות וכל התוכנית עפה לעזזל בעקבות זאת.

אני ממליץ מייד אחרי כל קריאה לfree להציב NULL בתוך
המצביע, זה חוסך בעיות אבל לא את כולן שכן במקרים
רבים יש לך שני מצביעים ויותר לתוך אותו בלוק בזיכרון.

DRYICE


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Dudenland

דרג אמינות חבר זה
   00:33   04.12.02   
אל הפורום  
  4. ...ואם כבר הרחבת...  
בתגובה להודעה מספר 3
 
   הפונקצייה free מודיעה למערכת ההפעלה (במקרה זה Windows, אני משער), שהזיכרון הזה כבר לא בשימוש...

כידוע, מערכות ההפעלה נותנות לכל תוכנית "הרגשה" כאילו יש להן את כל המשאבים של המחשב, ושהן פועלות לבד, אף על פי שהן לא - אף פעם !!!

אם תוכנית מסויימת תבקש בלוק זיכרון, אז מערכת ההפעלה תחזיר לה בלוק זיכרון, שידוע לה שהוא לא בשימוש, ולכן, כשקוראים לפונקצייה הזו, היא "מפנה שימוש" בזיכרון.

לכן, אין זה אומר, שהבלוק זיכרון הזה ישתנה ל-NULL או משהו כזה, כי בפעולה הזו, אין שינוי בתוכן (ByVal) של הזיכרון...

בכל מקרה, אצלי במקרה זה שינה (טוב, לא במקרה, ניסיתי את זה 10 פעמים לפני שעניתי)...ואגב...השתמשתי באותו קומפיילר תחת Windows XP (יכול להיות שהסיבה היא ה-Windows, כי הארכיטקטורה של ה-XP שונה לחלוטין מהארכיקטורה של 95/98/Me/NT4...)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net