[שאלה] malloc ו - free ב - C. - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

[שאלה] malloc ו - free ב - C.


Sarlula

Recommended Posts

נגיד והתבקשתי לבצע הקצאה דינמית של משתנה int בודד:

int* pnNumber;
pnNumber = (int*) malloc(sizeof(int));

ולאחר מכן ארצה לשחרר אותו בעזרת free:

free(pnNumber);

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

שהיא מקבלת כ - void*?

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

איך הפונקציה free תדע כמה לשחרר אם כל מה שנשלח אליה הוא מצביע של התא הראשון בזיכרון?

קישור לתוכן
שתף באתרים אחרים

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

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


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.

קישור לתוכן
שתף באתרים אחרים

לא ממש הבנתי מה שכתבת.

יכול להיות שלא הבנת מה כתבתי:

זאת עובדה שאני יכול לתת ל - malloc את sizeof של מערך של 80 int-ים (כלומר malloc של 80*4).

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

איך free יודע כמה int-ים הוקצאו? הרי שהפונקציה free מקבלת רק כתובת של תא אחד,

הוא לא יודע כמה תאים הוקצאו.

קישור לתוכן
שתף באתרים אחרים

איך free יודע כמה int-ים הוקצאו? הרי שהפונקציה free מקבלת רק כתובת של תא אחד,

הוא לא יודע כמה תאים הוקצאו.

free לא יודע כמה int-ים הוקצאו. כל מה שהוא יודע זה שב-malloc ביקשת X בתים.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...