שחרור זיכרון באמצעות 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.
אתגר
קלכתבו תוכנית ב-C שמדגימה את מחזור החיים המלא של הקצאת זיכרון דינמית ושחרורו. התוכנית שלכם צריכה:
- לקרוא מהמשתמש מספר שלם
countשמייצג כמה מספרים שלמים יש לאחסן - להשתמש ב-
malloc()עםsizeof()כדי להקצות זיכרון דינמית למערך שלcountמספרים שלמים - לבדוק אם הקצאת הזיכרון הצליחה — אם היא נכשלת, להדפיס
Memory allocation failed!ולסיים את התוכנית - אם ההקצאה מצליחה, להדפיס
Memory allocated successfully! - לקרוא מהמשתמש
countערכים של מספרים שלמים ולאחסן אותם במערך שהוקצה - לחשב ולהדפיס את סכום כל הערכים בתבנית:
Sum: [value] - למצוא ולהדפיס את הערך המרבי בתבנית:
Maximum: [value] - להשתמש ב-
free()כדי לשחרר את הזיכרון - להדפיס
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;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיות6ניהול זיכרון
זיכרון מחסנית לעומת ערימההקצאה דינמית - malloc()שימוש ב-sizeof() להקצאהבדיקת כישלון בהקצאהשחרור זיכרון באמצעות free()הקצאה באמצעות calloc()סיכום: מערך דינמיתרגלו בעצמכם: קומפיילר C אונליין