שיחה:שפת C/ניהול זיכרון דינאמי

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי
קפיצה לניווט קפיצה לחיפוש

כתוב "נרחיב על "הסבות" בפרק המתאים." באיזה פרק?--80.178.120.186 11:12, 21 באוגוסט 2006 (IDT)

'זוהי "הסבה" לטיפוס שאנו רוצים לעבוד איתו (מצביע ל-int), והיא הכרחית' -- למעשה המשפט הזה לא נכון. הקומפיילר צריך לעשות את ההמרה לבדו. ההמרה המפורשת רק גורמת לקוד להראות רע, ובמקרה של שינוי הטיפוס גם למעמסה. הצורה האופטימלית של השורה, לדעתי, היא זו: int *ptr = malloc(n * sizeof(*ptr)); אך במקרה הנ"ל כנראה עדיף להשאיר את הביטוי בתוך ה-sizeof כשם הטיפוס sizeof(int).

הקצאת זיכרון דינאמית, או ניהול זיכרון דינאמי?[עריכה]

הפרק מדבר גם על שחרור זיכרון, לא? נראה לי שהקצאת זיכרון זה חצי מהסיפור. אולי כדאי להעביר את שם הפרק?Thedsadude 07:58, 30 בנובמבר 2007 (IST)

לא ראיתי הערות נגדיות, אז העברתי.Thedsadude 20:20, 3 בדצמבר 2007 (IST)

הנושא "שימוש בזיכרון דינאמי לאורך התכנית"[עריכה]

ישנה בעיה של שימוש (שגוי) מחוץ לפנקציה במשתנים שהוקצו על הstack בתוך פונקציה, ומראים כאן איך לפתור זאת על ידי הקצאה על הheap בתוך הפונקציה ("הפתרון לבעיה הוא בהקצאה דינאמית").

לדעתי הנושא בעייתי מאד. ראשית, ברור שאפשר לפתור זאת פשוט על ידי הקצאה (על הheap או הstack) לפני הקריאה לפונקציה, והעברת כתובת לפונקציה. הטענה, לכן, שהפתרון כאן הוא קטגורית בהקצאה דינאמית - לדעתי שגוי; הפתרון אורתוגונאלי להקצאה דינאמית. מעבר לכך, הפתרון המוצג כאן מופיע במקומות רבים אחרים בתור "מתכון" לmemory leaks, שכן הmalloc מוחבא בתוך הפונקציה, ויש סיכוי סביר לשכוח לקרוא לfree. לבסוף, אני חושב שהשם "שימוש בזיכרון דינאמי לאורך התוכנית" הוא שם כללי מאד, שמתאים, נניח, לאסטרטגיה לניהול זיכרון, ולא לבעיה מאד נקודתית כמו כאן.

אני מוחק, לכן, את הנושא. בעתיד אני אעביר את תכנו (למעט הפיתרון הנוכחי, שכאמור לדעתי אינו טוב) למקומות אחרים.

Thedsadude 08:24, 3 בדצמבר 2007 (IST)

שגיאה רצינית בהסבר לגבי realloc[עריכה]

להלן דוגמה הניתנת בנושא:

oldArr = (int*)realloc( oldArr, newSize );

נניח שהקריאה נכשלה. אז oldArr יקבל NULL, ותהיה דליפת זיכרון.Thedsadude 18:31, 3 בדצמבר 2007 ( IST):

נראה לי שאכתוב תרגיל שמראה מה בעייתי בזה.Thedsadude 20:20, 3 בדצמבר 2007 (IST)
כתבתי. Thedsadude 21:12, 3 בדצמבר 2007 (IST)
וכן, כיף לי להתכתב עם עצמי.Thedsadude 21:12, 3 בדצמבר 2007 (IST)
ככה אתם מבינים אחד את השני הכי טוב... :-) Mintz l 21:06, 4 בדצמבר 2007 (IST)

בשביל מה צריך ניהול זיכרון דינאמי?[עריכה]

כל המוטיבציה והדגש של הדף הזה ישנים מדי. מסתבר שבשפת C היום, אין שום בעיה להקצות על המחסנית מערך בגודל משתנה. המוטיבציה הפשוטה ביותר שנותרה, אם כן, היא רשימה מקושרת. זה אומר שחייבים להעביר את הפרק הזה אחרי שפת C/מבנים. Thedsadude 13:25, 16 בדצמבר 2007 (IST)

בלגן ברשימה[עריכה]

יכול להיות שאני פשוט עייף, אבל הפיסקה שמתארת את הרשימות המקושרות נראית קצת חסרה: לא ברור מהו המשתנה list, מה זה list->head, ומה ההבדל בינו לבין head. לא יזיק לחדד קצת את העניין. Johnny Zoo 00:03, 24 בדצמבר 2007 (IST)

כן, הדף בעריכה, אם לא שמת לב. Thedsadude 10:16, 24 בדצמבר 2007 (IST)
טוב, כנראה שהייתי באמת עייף אתמול. Johnny Zoo 18:06, 24 בדצמבר 2007 (IST)
לא נורא, מה גם שאתה צודק, ואכן מה שתיארת כלא ברור באמת לא ברור. שינה עריבה! Thedsadude 21:06, 24 בדצמבר 2007 (IST)
טוב, סיימתי חלק זה. הערות יתקבלו בשמחה. Thedsadude 11:47, 27 בדצמבר 2007 (IST)