Αν σε μία κλάση δε γράψουμε 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 των κλάσεων που η κλάση κληρονομεί.