User Tools

Site Tools


cpp:destructors

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
cpp:destructors [2021/05/07 04:28] gthanoscpp:destructors [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
Line 1: Line 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>
Line 22: Line 22:
     int getHeight();     int getHeight();
 }; };
 +</code>
 +
 +<code cpp Rectangle.cpp>
 +#include "Rectangle.hpp"
  
 Rectangle::Rectangle(int w, int h) { Rectangle::Rectangle(int w, int h) {
Line 44: Line 48:
 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 () {
Line 52: Line 60:
 </code> </code>
  
-Στο παραπάνω παράδειγμα, εάν δεν οριστεί καταστροφέας η μνήμη θα παραμείνει δεσμευμένη μέχρι να τερματιστεί το πρόγραμμα, οδηγώντας το πρόγραμμα σε απώλεια μνήμης (memory leak).+Στο παραπάνω παράδειγμα, εάν δεν οριστεί καταστροφέας η μνήμη θα παραμείνει δεσμευμένη μέχρι να τερματιστεί το πρόγραμμα και η μνήμη να ελευθερωθεί από το λειτουργικό μαζί με όλους τους πόρους του προγράμματος. Σε αυτή την περίπτωση το πρόγραμμα κατά την εκτέλεση του δεν απελευθερώνει τη μνήμη που δέσμευσε.
  
  
  
cpp/destructors.1620361729.txt.gz · Last modified: 2021/05/07 03:28 (external edit)