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 revision Previous revision
Next revision
Previous revision
cpp:destructors [2020/04/08 10:42]
gthanos
cpp:destructors [2021/05/17 06:36]
Line 1: Line 1:
-===== Καταστροφείς της κλάσης ===== 
- 
-Εκτός από τον κατασκεαυστή μίας κλάσης, στη C++ έχουμε τη δυνατότητα να ορίσουμε και τον καταστροφέα μιας κλάσης. Ο καταστροφέας χρησιμοποιείται ώστε να γίνουν οι απαραίτητες εργασίες "καθαρισμού" για το αντικείμενο που καταστρέφεται. Για παράδειγμα, είναι πιθανόν κατά την δημιουργία του αντικειμένου στον κατασκευαστή να έχει δεσμευθεί μνήμη την οποία κατά την καταστροφή πρέπει να ελευθερώσουμε. Συμπληρωματικά μπορεί να έχουν ανοιχθεί στον κατασκευαστή αρχεία τα οποία κατά την καταστροφή του αντικειμένου πρέπει να τα κλείσουμε.  
- 
-Στο παρακάτω παράδειγμα βλέπετε την κλάση //Rectangle// όπου τα πεδία width και height είναι δείκτες σε ακέραιο και όχι ακέραιοι. Σε αυτή την περίπτωση θα πρέπει να δεσμεύουμε την απαραίτητη μνήμη με χρήση του τελεστή new στον κατασκευαστή, ενώ στον καταστροφέα την κλάσης απελευθερώνουμε τη μνήμη που δεσμεύσαμε προηγούμενα. 
- 
-<code cpp Rectangle.cpp> 
-#include <iostream> 
-#include <cstdlib> 
-using namespace std; 
- 
-class Rectangle { 
-  private: 
-    int* width; 
-    int* height; 
-  public: 
-    Rectangle(int w, int h); 
-    ~Rectangle(); 
-    void setWidth(int w); 
-    void setHeight(int h); 
-    int getWidth(); 
-    int getHeight(); 
-}; 
- 
-Rectangle::Rectangle(int w, int h) { 
-  width = new (nothrow) int;     
-  height = new (nothrow) int; 
-  if(width == NULL || height == NULL) { 
-    cerr << "Memory allocation failure!\n"; 
-    exit(-1); 
-  } 
-  *width = w; *height = h; 
-  cout << "Constructing rectangle (w:"<< *width <<", h:"<<*height<<")\n"; 
-} 
- 
-Rectangle::~Rectangle() { 
-  cout << "Destructing rectangle (w:"<< *width <<", h:"<<*height<<")\n"; 
-  delete width; 
-  delete height; 
-} 
- 
-void Rectangle::setWidth(int w) { *width = w; } 
-void Rectangle::setHeight(int h) { *height = h; } 
-int Rectangle::getWidth() { return *width; } 
-int Rectangle::getHeight() { return *height; } 
- 
-int main () { 
-  Rectangle rect(5,6); 
-  cout << "area: " << rect.getWidth() * rect.getHeight() << endl; 
-  return 0; 
-} 
-</code> 
- 
-Στο παραπάνω παράδειγμα, εάν δεν οριστεί καταστροφέας η μνήμη θα παραμείνει δεσμευμένη μέχρι να τερματιστεί το πρόγραμμα, οδηγώντας το πρόγραμμα σε απώλεια μνήμης (memory leak). 
- 
- 
  
cpp/destructors.txt · Last modified: 2021/05/17 06:36 (external edit)