שחרור הקצאה דינמית

  • פותח הנושא ocp1
  • פורסם בתאריך

ocp1

New member
שחרור הקצאה דינמית

לימדו אותי שאחרי שמקצים דינמית יש לשחרר את ההקצאה ע"י שימוש בפקודה free. להלן פונקציה שכתבתי. אני בכמה דילמות : 1. מתי ואיפה אני מכניס את השורה free ? אם אני מכניס אותה לפני ה- return אז לא יוחזר כלום לפונקציה הראשית. אם אני כותב אותה אחרי ה- return היא לא מתבצעת. 2. האם בכלל עלי לשחרר את ההקצאה ? כי להבנתי לאחר שהפונקציה "יוצאת" המשתנים שבתוכנה "מתים". סביר להניח שזה לא נכון בעניין של הקצאה דינמית, אבל מה לעשות... אני מבולבל. כל עזרה תתקבל בברכה.
int i = 0; Monom* new_poly; new_poly = (Monom*) malloc (poly_size * (sizeof (Monom))); for (; arr_size >= 0; arr_size--, i++) { if (arr[arr_size] != 0) { new_poly.coefficient = arr[arr_size]; new_poly.power = arr_size; } } return new_poly;
 
כמה דברים - את הזיכרון צריך לשחרר אחרי שסיימת להשתמש בו ואתה לא צריך אותו יותר. מן הסתם, אם הפונקציה הזו הקצתה זיכרון ומילאה אותו בתוכן, ואתה צריך את התוכן הזה להמשך התוכנית, אל תשחרר אותו עדיין. תשחרר אותו רק באותה נקודת זמן שאתה בטוח לחלוטין שאתה לא הולך להשתמש בו יותר (לא לקרוא ממנו ולא לכתוב אליו). - ביציאה מפונקציה, משתחררים אוטומטית כל המשתנים המקומיים (לוקליים) שלה, לא משתחררות הקצאות דינמיות שבוצעו ב malloc. הקצאות ב malloc משתחררות רק ב free. קרא גם כאן: http://www.tapuz.co.il/tapuzforum/main/Viewmsg.asp?forum=89&msgid=96227121
 

ocp1

New member
../images/Emo207.gifהאם תוכלו לעזור לי עם הקוד ?

הסיבה לשאלות על שחרור הקצאה דינמית היא שכתבתי קוד וכשאני מנסה להריץ אותו, מסך ה- cmd פשוט "קופא". אני מנחש שזה קשור להקצאה דינמית. הסבר על הקוד : עלי לכתוב קוד שמקבל רצף של מספרים לתוך ה- struct מונום, עם ההגבלות הבאות : 1. המערך לא יכיל מונום שמקדמו 0. 2. המונומים יופיעו בסדר חזקות יורד ממש. הקוד עצמו עוד לא גמור, וכפי שאני נוכח לגלות הוא עוד מלא באגים. השאלה שלי אם מישהו יכול להצביע לי על מיקום ספציפי, או לחילופין מה אני עושה לא נכון. כמו-כן, לקראת סוף הקוד, הייתה לו נטייה לא להצליח ליצור מערך דינימי. לכן הכנסתי שם לולאה שתשחרר את המערך ותיצור אותו מחדש. האם זה קביל ? האם זו דרך נכונה או שמא אני מכריח את התוכנה לתת לי מקום למרות שבאמת אין לה. אני יודע, יותר מדי שאלות, פחות מדי זמן. אודה לכל עזרה.
 
למעלה