Both sides previous revisionPrevious revisionNext revision | Previous revision |
cpp:destructors [2020/04/08 10:42] – gthanos | cpp:destructors [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 |
---|
===== Καταστροφείς της κλάσης ===== | ===== Καταστροφείς της κλάσης ===== |
| |
Εκτός από τον κατασκεαυστή μίας κλάσης, στη C++ έχουμε τη δυνατότητα να ορίσουμε και τον καταστροφέα μιας κλάσης. Ο καταστροφέας χρησιμοποιείται ώστε να γίνουν οι απαραίτητες εργασίες "καθαρισμού" για το αντικείμενο που καταστρέφεται. Για παράδειγμα, είναι πιθανόν κατά την δημιουργία του αντικειμένου στον κατασκευαστή να έχει δεσμευθεί μνήμη την οποία κατά την καταστροφή πρέπει να ελευθερώσουμε. Συμπληρωματικά μπορεί να έχουν ανοιχθεί στον κατασκευαστή αρχεία τα οποία κατά την καταστροφή του αντικειμένου πρέπει να τα κλείσουμε. | Εκτός από τον κατασκευαστή μίας κλάσης, στη C++ έχουμε τη δυνατότητα (και συχνά οφείλουμε) να ορίσουμε και τον καταστροφέα της. Ο καταστροφέας καλείται κατά την καταστροφή του αντικειμένου, ώστε να γίνουν οι απαραίτητες εργασίες "καθαρισμού". Για παράδειγμα, είναι πιθανόν κατά την δημιουργία του αντικειμένου στον κατασκευαστή να έχει δεσμευθεί μνήμη την οποία κατά την καταστροφή του πρέπει να ελευθερώσουμε. Επιπλέον, μπορεί να έχουν ανοιχθεί στον κατασκευαστή αρχεία ή άλλοι πόροι του συστήματος τα οποία κατά την καταστροφή του αντικειμένου πρέπει να τα κλείσουμε. Στη διεθνή βιβλιογραφία ο καταστροφέας της κλάσης απαντάται ως //destructor//. |
| |
Στο παρακάτω παράδειγμα βλέπετε την κλάση //Rectangle// όπου τα πεδία width και height είναι δείκτες σε ακέραιο και όχι ακέραιοι. Σε αυτή την περίπτωση θα πρέπει να δεσμεύουμε την απαραίτητη μνήμη με χρήση του τελεστή new στον κατασκευαστή, ενώ στον καταστροφέα την κλάσης απελευθερώνουμε τη μνήμη που δεσμεύσαμε προηγούμενα. | Στο παρακάτω παράδειγμα βλέπετε την κλάση //Rectangle// όπου τα πεδία width και height είναι δείκτες σε ακέραιο και όχι ακέραιοι. Σε αυτή την περίπτωση θα πρέπει να δεσμεύουμε την απαραίτητη μνήμη με χρήση του τελεστή new στον κατασκευαστή, ενώ στον καταστροφέα την κλάσης απελευθερώνουμε τη μνήμη που δεσμεύσαμε προηγούμενα. |
| |
<code cpp Rectangle.cpp> | <code cpp Rectangle.hpp> |
#include <iostream> | #include <iostream> |
#include <cstdlib> | #include <cstdlib> |
int getHeight(); | int getHeight(); |
}; | }; |
| </code> |
| |
| <code cpp Rectangle.cpp> |
| #include "Rectangle.hpp" |
| |
Rectangle::Rectangle(int w, int h) { | Rectangle::Rectangle(int w, int h) { |
int Rectangle::getWidth() { return *width; } | int Rectangle::getWidth() { return *width; } |
int Rectangle::getHeight() { return *height; } | int Rectangle::getHeight() { return *height; } |
| </code> |
| |
| <code cpp RectangleUsage.cpp> |
| #include "Rectangle.hpp" |
| |
int main () { | int main () { |
</code> | </code> |
| |
Στο παραπάνω παράδειγμα, εάν δεν οριστεί καταστροφέας η μνήμη θα παραμείνει δεσμευμένη μέχρι να τερματιστεί το πρόγραμμα, οδηγώντας το πρόγραμμα σε απώλεια μνήμης (memory leak). | Στο παραπάνω παράδειγμα, εάν δεν οριστεί καταστροφέας η μνήμη θα παραμείνει δεσμευμένη μέχρι να τερματιστεί το πρόγραμμα και η μνήμη να ελευθερωθεί από το λειτουργικό μαζί με όλους τους πόρους του προγράμματος. Σε αυτή την περίπτωση το πρόγραμμα κατά την εκτέλεση του δεν απελευθερώνει τη μνήμη που δέσμευσε. |
| |
| |
| |