להבין ולמנוע דליפות זיכרון בדלפי

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

תוך כדי התפתחות יישומים בדלפי זה (כמעט) תמיד כיף, יש מצבים שאתה מרגיש כאילו כל העולם נגדך.

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

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

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

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

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

instagram viewer
בעלים וישחרר את הזיכרון שצילם הרכיב ברגע שהטופס ייסגר (נהרס). הטופס, כבעלים, אחראי על חלוקת הזיכרון של הרכיבים שאירח. בקיצור: רכיבים בטופס נוצרים ונהרסים אוטומטית

דוגמאות לדליפות זיכרון

בכל יישום דלפי שאינו טריוויאלי, תרצה להפעיל רכיבי דלפי בזמן ריצה. יהיה לך גם כמה שיעורים מותאמים אישית משלך. נניח שיש לך תוכנית מתקדמת בכיתה שיש לה שיטת DoProgram. כעת, כאשר אתה צריך להשתמש בכיתה TDeveloper, אתה יוצר מופע של הכיתה על ידי קורא ל- צור שיטה (בנאי). שיטת Create מקצה זיכרון לאובייקט חדש ומחזירה הפניה לאובייקט.

var
zarko: TDeveloper
התחל
zarko: = TMyObject. צור;
זרקו. DoProgram;
סוף;

והנה דליפת זיכרון פשוטה!

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

var
zarko: TDeveloper
התחל
zarko: = TMyObject. צור;
נסה
זרקו. DoProgram;
סוף סוף
זרקו. חינם;
סוף;
סוף;

זוהי דוגמא להקצאת זיכרון וקוד מיקום מיקוד בטוח.

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

מלבד יצירה והשמדה של אובייקטים בשיטות Create and Free, עליכם להיזהר מאוד גם בעת שימוש במשאבים "חיצוניים" (קבצים, מסדי נתונים וכו ').
נניח שאתה צריך לפעול על קובץ טקסט כלשהו. בתרחיש פשוט מאוד, שבו משתמשים בשיטת AssignFile כדי לשייך קובץ בדיסק לקובץ לאחר שתסיים את הקובץ, עליך להתקשר ל- CloseFile כדי לשחרר את ידית הקובץ להתחיל בשימוש. כאן אין לך קריאה מפורשת ל- "חינם".

var
F: TextFile;
S: מחרוזת;
התחל
AssignFile (F, 'c: \ somefile.txt');
נסה
Readln (F, S);
סוף סוף
CloseFile (F);
סוף;
סוף;

דוגמא נוספת כוללת טעינת קבצי DLL חיצוניים מהקוד שלך. בכל פעם שאתה משתמש ב- LoadLibrary, עליך להתקשר ל- FreeLibrary:

var
dllHandle: THandle;
התחל
dllHandle: = Loadlibrary ('MyLibrary. DLL ');
// עשה משהו עם ה- DLL הזה
אם dllHandle <> 0 אז FreeLibrary (dllHandle);
סוף;

דליפות זיכרון ב- .NET?

למרות ש- Delphi עבור .NET אספן האשפה (GC) מנהל את רוב משימות הזיכרון, ישנן דליפות זיכרון ביישומי NET. להלן דיון במאמר GC בדלפי עבור .NET.

כיצד להילחם נגד דליפות זיכרון

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

instagram story viewer