Exceptions

  • פותח הנושא GLev
  • פורסם בתאריך

GLev

New member
Exceptions

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

the new L

New member
תשובה

כשאתה מקצה זיכרון על ה HEAP אתה לוקח לעצמך את האחריות לקרוא ל DELETE. כי למשל אתה יכול להחליט שאתה רוצה להרוס את האובייקט הזה רק במועד מאוחר יותר, והעובדה שנזרקה exception לא אומרת שאתה רוצה שהוא ייהרס בכלל. ככלל, הקומפיילר לעולם לא דואג לקרוא בעצמו ל delete לאובייקט שאתה מקצה על ה heap ולעומת זאת הוא כמעט תמיד ידאג לקרוא ל destructor של אובייקטים שהוקצו על ה stack (חוץ במקרי יציאה קיצונית מהתוכנית...).
 

GLev

New member
?

כשאני מקצה אובייקט דינמית הוא מוסיף אותו ל Heap? וכשאני מקצה אובייקט בצורה רגילה הוא מוסיף אותו ל Stack?
 

codec

New member
אכן, תמונות קשות...

מה לעשות, זה מה יש...
 

DarkSwell

New member
תשובה..

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