דליפות זיכרון
שיעור 12 מתוך 14 בקורס מצביעים ב-C++ של Coddy.
בשיעור הקודם השתמשנו במילת המפתח delete, כי חשוב מאוד לשחרר את הזיכרון שהקצית. עכשיו נלמד על כך ביתר פירוט.
דליפת זיכרון מתרחשת כאשר תוכנית מקצה זיכרון מהערימה, אך אינה משחררת אותו לאחר שאין בו עוד צורך.
למעשה, כשאנחנו מריצים את התוכנית, אנחנו מקצים את הזיכרון הדרוש, ובהמשך שוכחים ממנו, והזיכרון הזה לעולם אינו משתחרר או נמחק. ראו את הדוגמה שלהלן:
int *p, *q; // הצהרה
p = new int; // הקצאת זיכרון
q = new int; // הקצאת זיכרון
*p = 10; // הצבת ערך
*q = 20; // הצבת ערך
cout << *p << " " << *q << endl;
q = p; // q ו-p מצביעים לאותו מיקום
// המיקום המקורי של q אבד
cout << *p << " " << *q << endl;
delete p;
delete q;Output:
10 20
10 10בהתחלה אנחנו מצהירים על המצביעים, מקצים זיכרון לכל אחד מהם עבור מספר שלם אחד, ואז מציבים ערכים בכתובות האלה. כפי שאפשר לראות, אנחנו יכולים להדפיס אותם באמצעות ה-cout הראשון.
הדברים נעשים מעניינים בשורה <i>q = p</i>: אנחנו מגדירים את המצביע <i>q</i> כך שיצביע על אותו מיקום שאליו מצביע <i>p</i>. כתוצאה מכך, המיקום ההתחלתי שהקצינו עבור <i>q</i> אינו נגיש עוד ואי אפשר לגשת אליו או למחוק אותו, והוא אובד לצמיתות.
כפי שאפשר לראות בשורה הבאה, אנחנו מדפיסים שוב את המצביעים לאחר הסרת ההפניה שלהם ומקבלים ערכים שווים, כי הם מצביעים על אותו מיקום.
לכן חשוב כל כך להקפיד על דליפות זיכרון ולנהל נתונים שהוקצו באופן דינמי.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
אתגר
קלכתוב את אותה תוכנית מהשיעור הקודם, אבל הפעם שחרר את כל הזיכרון שהוקצה באמצעות מילת המפתח delete. הקצה זיכרון באופן דינמי לשלושה מספרים שלמים באמצעות המצביעים ptrA, ptrB ו-ptrC. השתמש בשלושת המספרים השלמים שניתנו כארגומנטים של הפונקציה והגדר את הערכים בכתובות שעליהן מצביעים המצביעים כך שישתוו למספרים השלמים, בהתאמה. המספר השלם הראשון ל-ptrA, המספר השלם השני ל-ptrB והמספר השלם האחרון ל-ptrC, ולבסוף הדפס את כל המצביעים לאחר ביצוע הפניה, כשהם מופרדים ברווח
אל תכתוב את הפונקציה <i>main()</i>
נסו בעצמכם
#include <iostream>
using namespace std;
void dynamicMemory(int a, int b, int c) {
// הכניסו את הקוד שלכם כאן
// שחררו את הזיכרון
}
// אל תכתבו את הפונקציה main()כל השיעורים ביחידה מצביעים ב-C++
תרגלו בעצמכם: קומפיילר C++ אונליין