Εργαστήριο Τεχνολογίας Λογισμικού
0 votes
201 views

Γιατί χρειάζεται ο destructor που βάλαμε στην class array, αφού μπορει να τον βάλει αυτόματα και η C++ απο μόνη της; Είναι επειδή αναφερόμαστε σε δυναμική δομή (με το delete [] data) και έτσι χρειάζεται γιατί δε τον βάζει απο μόνης της η C++ ή για άλλο λόγο;

in progtech by (820 points)
edited by | 201 views

1 Answer

0 votes

Αν σε μία κλάση δε γράψουμε destructor, η C++ (ακριβέστερα, η υλοποίησή της, δηλαδή ο compiler μας) προσθέτει αυτόματα έναν default destructor. Ο default destructor είναι σαν να είχε γραφεί έτσι (υποθέτω εδώ ότι η κλάση μας λέγεται Array):

~Array() {}

δηλαδή δεν έχει τίποτα στο σώμα του. Αυτό έχει ως αποτέλεσμα, όταν καταστρέφονται αντικείμενα της κλάσης να μη γίνεται τίποτα ιδιαίτερο.

Στα πεδία της κλάσης Array υπάρχει το data, που έχει τύπο T *. Είναι ένας δείκτης σε έναν πίνακα από T που κατασκευάζεται δυναμικά, στον constructor και αλλού. Αν δεν προβλέψουμε εμείς ρητά στον destructor αυτός ο πίνακας να γίνει delete, τότε ο πίνακας δε θα καταστρέφεται. Αυτό θα έχει ως αποτέλεσμα η μνήμη του πίνακα να μην αποδεσμευθεί και να μην κληθούν οι καταστροφείς των αντικειμένων τύπου T που περιέχει. Επομένως, χρειάζεται ένας destructor, αντί του default, με το εξής σώμα:

~Array() { delete [] data; }

Θέλω να συμπληρώσω εδώ ότι τα παρακάτω συμβαίνουν πάντα στην καταστροφή των αντικειμένων, παρότι δεν γράφονται ρητά στους destructors (είτε αυτούς που γράφουμε εμείς, είτε τον default με το κενό σώμα που γράφεται αυτόματα):

  • Καταστρέφονται τα πεδία της κλάσης που είναι αντικείμενα, με κλήση των αντίστοιχων destructors (στη δική μας κλάση Array αυτό δε συμβαίνει γιατί δεν υπάρχουν τέτοια πεδία --- το data είναι δείκτης, όχι αντικείμενο).
  • Καλούνται οι destructors των κλάσεων που η κλάση κληρονομεί.
by (9.5k points)
Διευκρινιστική
0

Οπότε δηλαδή εμείς γράφουμε τον destructor στο συγκεκριμένο επειδή έχουμε το data που είναι δυναμικός πίνακας ενώ αν είχαμε μια άλλη μεταβλητή δε θα χρειαζόταν; Ή και σε μια οποιαδήποτε άλλη μεταβλητή θα χρειαζόταν;

301 questions

289 answers

288 comments

770 users