שיעור 24: בטיחות זיכרון — דליפות ו-dangling pointers
למדנו לבקש זיכרון — עכשיו לומדים לא להסתבך איתו. דליפת זיכרון קורית כשמאבדים את המצביע האחרון לבלוק בלי לשחרר אותו, למשל כשמשימים ל-p כתובת חדשה לפני free. שחרור כפול (double free) הוא התנהגות לא מוגדרת, ושימוש במצביע אחרי free — מצביע משתלשל (dangling) — מסוכן לא פחות. ההרגלים המגנים: מיד אחרי free
חשב/י על מפתחות לתאי אחסון: דליפה היא לאבד את המפתח היחיד לתא מלא — התא תפוס לנצח. שחרור כפול הוא לנסות להחזיר את אותו מפתח פעמיים — בדלפק משתוללים. מצביע משתלשל הוא להשתמש בעותק של מפתח לתא שכבר החזרת — מי יודע מה (או מי) נמצא שם עכשיו.
- דליפת זיכרון
- איבוד המצביע האחרון לבלוק מוקצה בלי לקרוא ל-free — הזיכרון נשאר תפוס ואין דרך לשחררו.
- שחרור כפול (double free)
- קריאה ל-free פעמיים על אותו בלוק. התנהגות לא מוגדרת — קריסה או השחתת זיכרון.
- מצביע משתלשל (dangling)
- מצביע שעדיין מחזיק כתובת של בלוק ששוחרר. שימוש בו (use-after-free) הוא התנהגות לא מוגדרת.
- בעלות (ownership)
- דרך החשיבה המגנה: לכל בלוק יש 'בעלים' אחד שאחראי לשחרר אותו — בדיוק פעם אחת. תמיד לשאול 'מי אחראי לשחרר?'.
- valgrind
- כלי שמריץ את התוכנית ומאתר דליפות ושגיאות זיכרון: valgrind ./prog.