User Tools

Site Tools


cpp:destructors

This is an old revision of the document!


Καταστροφείς της κλάσης

Εκτός από τον κατασκεαυστή μίας κλάσης, στη C++ έχουμε τη δυνατότητα να ορίσουμε και τον καταστροφέα μιας κλάσης. Ο καταστροφέας χρησιμοποιείται ώστε να γίνουν οι απαραίτητες εργασίες “καθαρισμού” για το αντικείμενο που καταστρέφεται. Για παράδειγμα, είναι πιθανόν κατά την δημιουργία του αντικειμένου στον κατασκευαστή να έχει δεσμευθεί μνήμη την οποία κατά την καταστροφή πρέπει να ελευθερώσουμε. Συμπληρωματικά μπορεί να έχουν ανοιχθεί στον κατασκευαστή αρχεία τα οποία κατά την καταστροφή του αντικειμένου πρέπει να τα κλείσουμε.

Στο παρακάτω παράδειγμα βλέπετε την κλάση Rectangle όπου τα πεδία width και height είναι δείκτες σε ακέραιο και όχι ακέραιοι. Σε αυτή την περίπτωση θα πρέπει να δεσμεύουμε την απαραίτητη μνήμη με χρήση του τελεστή new στον κατασκευαστή, ενώ στον καταστροφέα την κλάσης απελευθερώνουμε τη μνήμη που δεσμεύσαμε προηγούμενα.

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;
}

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

cpp/destructors.1586342567.txt.gz · Last modified: 2020/04/08 09:42 (external edit)