Menu
Coddy logo textTech

שחרור זיכרון באמצעות free()

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 35 מתוך 63.

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

הפונקציה free() מקבלת ארגומנט אחד: מצביע לבלוק הזיכרון שברצונך לשחרר. זה חייב להיות אותו מצביע שהוחזר על ידי malloc() (או פונקציות קשורות כמו calloc()).

#include <stdlib.h>

int *ptr = (int*)malloc(sizeof(int));  // הקצה זיכרון
*ptr = 42;  // השתמש בזיכרון
free(ptr);  // שחרר את הזיכרון בסיום

אי-קריאה ל־free() יוצרת את מה שנקרא דליפת זיכרון. הזיכרון שהוקצה נשאר שמור עבור התוכנית שלך אף שאינך משתמש בו עוד. בתוכניות שפועלות זמן רב או בתוכניות שמקצות זיכרון שוב ושוב, הדליפות האלה עלולות לצרוך את כל זיכרון המערכת הזמין ולגרום לבעיות ביצועים או לקריסות.

זכור: לכל malloc() צריכה להיות התאמה של free(). צימוד זה חיוני לניהול אחראי של זיכרון בתכנות ב־C.

challenge icon

אתגר

קל

כתבו תוכנית ב-C שמדגימה את מחזור החיים המלא של הקצאת זיכרון דינמית ושחרורו. התוכנית שלכם צריכה:

  1. לקרוא מהמשתמש מספר שלם count שמייצג כמה מספרים שלמים יש לאחסן
  2. להשתמש ב-malloc() עם sizeof() כדי להקצות זיכרון דינמית למערך של count מספרים שלמים
  3. לבדוק אם הקצאת הזיכרון הצליחה — אם היא נכשלת, להדפיס Memory allocation failed! ולסיים את התוכנית
  4. אם ההקצאה מצליחה, להדפיס Memory allocated successfully!
  5. לקרוא מהמשתמש count ערכים של מספרים שלמים ולאחסן אותם במערך שהוקצה
  6. לחשב ולהדפיס את סכום כל הערכים בתבנית: Sum: [value]
  7. למצוא ולהדפיס את הערך המרבי בתבנית: Maximum: [value]
  8. להשתמש ב-free() כדי לשחרר את הזיכרון
  9. להדפיס Memory freed successfully! כדי לאשר את הניקוי

זכרו לכלול את הכותרת <stdlib.h> כדי להשתמש ב-malloc() וב-free(). האתגר הזה מדגים את הצימוד החיוני בין malloc() ל-free() כדי למנוע דליפות זיכרון בתוכניות שלכם.

לדוגמה, אם הקלט הוא:

4
15 8 23 12

הפלט שלכם צריך להיות:

Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!

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

נסו בעצמכם

#include <stdio.h>
#include <stdlib.h>

int main() {
    int count;
    
    // קראו את מספר המספרים השלמים שיש לאחסן
    scanf("%d", &count);
    
    // TODO: כתבו את הקוד שלכם למטה
    // 1. הקצו זיכרון באמצעות malloc() עם sizeof()
    // 2. בדקו אם הקצאת הזיכרון הצליחה
    // 3. קראו את ערכי המספרים השלמים ואחסנו אותם
    // 4. חשבו את הסכום ומצאו את הערך המרבי
    // 5. שחררו את הזיכרון שהוקצה
    
    return 0;
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר C אונליין