Menu
Coddy logo textTech

דליפות זיכרון

שיעור 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> אינו נגיש עוד ואי אפשר לגשת אליו או למחוק אותו, והוא אובד לצמיתות.


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

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

quiz iconבחנו את עצמכם

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

quiz iconבחנו את עצמכם

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

quiz iconבחנו את עצמכם

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

challenge icon

אתגר

קל

כתוב את אותה תוכנית מהשיעור הקודם, אבל הפעם שחרר את כל הזיכרון שהוקצה באמצעות מילת המפתח 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++ אונליין