שאלה של הרס (לא) עצמי

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

cstl

New member
שאלה של הרס (לא) עצמי

היי,

האם יש משמעות לקריאה מפורשת ל- destructor ?
הקוד הזה למשל (++C כמובן) :

#include <iostream>
using namespace std;

class Type
{
public:
Type()
{
cout << "I'm A c'tor" << endl;
}

~Type()
{
cout << "I'm a d'tor" << endl;
}
};

void main()
{
Type obj;
obj.~Type();
obj.~Type();
cin.get();
}

יוציא פלט כזה:

I'm a c'tor
I'm a d'tor
I'm a d'tor
I'm a d'tor

לכאורה, 2 הקריאות המפורשות להורס לא עשו שום רושם על התוכנית,
הוא התבצע אבל לא השפיע על קיום האובייקט.
מתי, אם בכלל, יש צורך בשימוש כזה?
מדוע בדוגמה הנ"ל, לא היתה שום השפעה על האובייקט?
האם יש קשר להקצאה סטטית או דינמית של האובייקט (עם new) ?
ואיפה נכנס לסיפור delete ?

תודה מראש
 

אiהד

New member
אם היה משהו באובייקט

הייתה מתקבלת חריגה עקב שחרור כפול של זיכרון
 

selalerer

New member
++C משתדלת להיות יעילה.

זה אומר שהיא לא מוסיפה לך קוד שלא דרוש. בעיקר בכדי לא לפגוע בביצועים.

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

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

אה, וההורס גם קורא והורסים של האיברים והאבות. שים לב לזה כשאתה קורא לו.
 

cstl

New member
אוקיי, נראה לי שהבנתי פחות או יותר. תודה לכם.

 

make clean

New member
תשובות לשאלות הנוספות

ענו לך נכון שבדוגמא שהצגת (וברוב המקרים) קריאה ישירה לDTOR היא טעות.
שימוש כזה כן נדרש במקרה והייתה קריאה ישירה ל CTOR ע"י PLACEMENT NEW וכד'. (אם אתה לא מכיר את המושג ואתה במהלך הלימודים לא נורא זה פיצ'ר שנלמד יחסית מאוחר).
בכל מקרה תיכנון בריא של מחלקה אמור לאפשא ל DTOR להקרא פעמיים - לשים כל מצביע ל NULL וכד' - אם הדבר לא מכביד מידי.
לשאלתך על DELETE- DELETE קורא באופן אוטומטי (הקומפיילר) ל DTOR לפני שהוא משחרר בפועל את הזיכרון.
 
למעלה