פורסם 2009 ביולי 1316 שנים נגיד והתבקשתי לבצע הקצאה דינמית של משתנה int בודד:int* pnNumber;pnNumber = (int*) malloc(sizeof(int));ולאחר מכן ארצה לשחרר אותו בעזרת free:free(pnNumber);איך הפונקציה free יודעת כמה בתים עליה לשחרר מהזיכרון אם כל מה שנשלח אליה הוא מצביעשהיא מקבלת כ - void*?כלומר, יכול להיות שהקצאנו בזיכרון תא אחד מטיפוס int ויכול להיות שהקצאנו מערך של 80 מטיפוס int.איך הפונקציה free תדע כמה לשחרר אם כל מה שנשלח אליה הוא מצביע של התא הראשון בזיכרון?
פורסם 2009 ביולי 1316 שנים יש (למיטב ידיעתי) בגדול שתי דרכים, כאשר אחת פופלרית במיוחד.הדרך המקובלת היא להקצות ממ"ה יותר בתים ממה שאתה מבקש, לכתוב בבתים הנוספים את הגודל. הפוינטר שאתה מקבל הוא מייד אחרי הגודל הזה:void* malloc(size_t size){ size_t real_size = size + 4; void * p = GetSomeAlignedMemory( real_size ); int* pint = (int*)p; *pint = real_size; return pint+1;}void free(void* ptr){ ... int* pint = (int*)p; int real_size = *(pint-1) void *real_p = (void*)(pint-1); ReturnTheMemory( real_p );}כמובן שקוד זה מתעלם מהמון דברים.דרך אחרת היא לשמור במבנה נתונים אחר ונפרד את הגודל של כל בלוק שהוקצה.שים לב שבשתי השיטות המשתמש חייב להחזיר ל-free את המצביע המדוייק שהוא קיבל מ-malloc.
פורסם 2009 ביולי 1316 שנים מחבר לא ממש הבנתי מה שכתבת.יכול להיות שלא הבנת מה כתבתי:זאת עובדה שאני יכול לתת ל - malloc את sizeof של מערך של 80 int-ים (כלומר malloc של 80*4).בעוד שלפונקציה free אני לא נותן שום מספר, אלא רק טיפוס.איך free יודע כמה int-ים הוקצאו? הרי שהפונקציה free מקבלת רק כתובת של תא אחד,הוא לא יודע כמה תאים הוקצאו.
פורסם 2009 ביולי 1316 שנים איך free יודע כמה int-ים הוקצאו? הרי שהפונקציה free מקבלת רק כתובת של תא אחד,הוא לא יודע כמה תאים הוקצאו.free לא יודע כמה int-ים הוקצאו. כל מה שהוא יודע זה שב-malloc ביקשת X בתים.
פורסם 2009 ביולי 1316 שנים מחבר הבנתי.malloc דואגת לשמור בזיכרון בצמוד למקום שהוקצה את מספר הבתים שהוקצאו,ככה שאין צורך להזכיר ל - free כמה בתים יש לשחרר.תודה רבה.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.