User Tools

Site Tools


cpp:object_lifecycle

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revisionBoth sides next revision
cpp:object_lifecycle [2020/04/12 16:01] gthanoscpp:object_lifecycle [2020/04/14 08:50] gthanos
Line 4: Line 4:
 Τα αντικείμενα που φτιάξαμε μέχρι τώρα αποθηκεύονται μέσα στη στοίβα (//stack//) της συνάρτησης που καλεί τον κατασκευαστή της. Τα αντικείμενα αυτά έχουν χρόνο ζωής όσο εκτελείται η συγκεκριμένη συνάρτηση και η στοίβα της είναι ενεργή. Μόλις επιστρέψουμε από την συνάρτηση που δημιουργεί το οποιοδήποτε αντικείμενο, αυτό καταστρέφεται αυτόματα. Εάν συντρέχουν λόγοι εκκαθάρισης μνήμης ή περιγραφέων αρχείων οφείλουμε να ορίσουμε καταστροφέα για τη συγκεκριμένη κλάση. Τα αντικείμενα που φτιάξαμε μέχρι τώρα αποθηκεύονται μέσα στη στοίβα (//stack//) της συνάρτησης που καλεί τον κατασκευαστή της. Τα αντικείμενα αυτά έχουν χρόνο ζωής όσο εκτελείται η συγκεκριμένη συνάρτηση και η στοίβα της είναι ενεργή. Μόλις επιστρέψουμε από την συνάρτηση που δημιουργεί το οποιοδήποτε αντικείμενο, αυτό καταστρέφεται αυτόματα. Εάν συντρέχουν λόγοι εκκαθάρισης μνήμης ή περιγραφέων αρχείων οφείλουμε να ορίσουμε καταστροφέα για τη συγκεκριμένη κλάση.
  
-Παρακάτω δίνεται ο κώδικας της συνάρτησης //foo// η οποία δημιουργεί ένα πίνακα από δύο αντικείμενα τύπου //Rectangle//. Τα αντικείμενα δημιουργούνται στο //stack// της διεργασίας που εκτελείται και έχουν χρόνο ζωής όσο διαρκεί η εκτέλεση της συνάρτησης //foo//. Μετά την έξοδο από την //foo// τα αντικείμενα //rect[0]// και //rect[1]// καταστρέφονται.+Παρακάτω δίνεται ο κώδικας της συνάρτησης //foo// η οποία δημιουργεί ένα πίνακα από δύο αντικείμενα τύπου //Rectangle//. Τα αντικείμενα δημιουργούνται στο //stack// της διεργασίας που εκτελείται και έχουν χρόνο ζωής όσο διαρκεί η εκτέλεση της συνάρτησης //foo//. Μετά την έξοδο από την //foo// τα αντικείμενα //rect[0]// και //rect[1]// καταστρέφονται. Η κλάση Rectangle που δημιουργείται δίνεται παρακάτω: 
 + 
 +<code cpp Rectangle.hpp> 
 +#include <iostream> 
 +#include <cstdlib> 
 +using namespace std; 
 + 
 +class Rectangle { 
 +  private: 
 +    int *width_ptr, *height_ptr; 
 +  public: 
 +    Rectangle(); 
 +    Rectangle(int w, int h); 
 +    Rectangle(int s); 
 +    ~Rectangle(); 
 +    void setWidth(int w); 
 +    void setHeight(int h); 
 +    int getWidth(); 
 +    int getHeight(); 
 +    int getArea(); 
 +}; 
 +</code> 
 + 
 +<code cpp Rectangle.cpp> 
 +#include "Rectangle.hpp" 
 + 
 +Rectangle::Rectangle() { 
 +  width_ptr = new (nothrow) int;     
 +  height_ptr = new (nothrow) int; 
 +  if(width_ptr == NULL || height_ptr == NULL) { 
 +    cerr << "Memory allocation failure!\n"; 
 +    exit(-1); 
 +  } 
 +  *width_ptr = *height_ptr = 0; 
 +  cout << "Calling 0 args constructor" << endl; 
 +
 + 
 +Rectangle::Rectangle(int w, int h) : Rectangle() { 
 +  *width_ptr = w; 
 +  *height_ptr = h; 
 +  cout << "Calling 2 args constructor" << endl; 
 +
 + 
 +Rectangle::Rectangle(int s) : Rectangle(s,s) { 
 +  cout << "Calling 1 args constructor" << endl; 
 +
 + 
 +Rectangle::~Rectangle() { 
 +  cout << "Destructing rectangle (w:"<< *width_ptr <<", h:"<<*height_ptr<<")\n"; 
 +  delete width_ptr; 
 +  delete height_ptr; 
 +
 + 
 +void Rectangle::setWidth(int w) { *width_ptr = w; } 
 +void Rectangle::setHeight(int h) { *height_ptr = h; } 
 +int Rectangle::getWidth() { return *width_ptr; } 
 +int Rectangle::getHeight() { return *height_ptr;
 +int Rectangle::getArea() { return *width_ptr * *height_ptr;
 +</code>
  
 <code cpp foo.cpp> <code cpp foo.cpp>
Line 19: Line 77:
 int main() { int main() {
   int x=5, y=3;   int x=5, y=3;
 +  cout << "x: " << x << ", y: " << y << endl;
   foo();   foo();
   cout << "x: " << x << ", y: " << y << endl;   cout << "x: " << x << ", y: " << y << endl;
Line 61: Line 120:
   - ο δείκτης //r4// δείχνει σε ένα δισδιάστατο πίνακα από αντικείμενα που αρχικοποιείται επίσης στο //heap//. Ο πίνακας έχει δύο γραμμές και μία στήλη.   - ο δείκτης //r4// δείχνει σε ένα δισδιάστατο πίνακα από αντικείμενα που αρχικοποιείται επίσης στο //heap//. Ο πίνακας έχει δύο γραμμές και μία στήλη.
   - πριν την ολοκλήρωση του προγράμματος είμαστε υποχρεωμένοι να ελευθερώσουμε τη μνήμη που δεσμεύτηκε στο //heap// κατά τη δημιουργία των αντικειμένων στα οποία δείχνουν οι δείκτες //r2, r3 και r4//.   - πριν την ολοκλήρωση του προγράμματος είμαστε υποχρεωμένοι να ελευθερώσουμε τη μνήμη που δεσμεύτηκε στο //heap// κατά τη δημιουργία των αντικειμένων στα οποία δείχνουν οι δείκτες //r2, r3 και r4//.
- 
-<code cpp Rectangle.hpp> 
-#include <iostream> 
-#include <cstdlib> 
-using namespace std; 
- 
-class Rectangle { 
-  private: 
-    int *width_ptr, *height_ptr; 
-  public: 
-    Rectangle(); 
-    Rectangle(int w, int h); 
-    Rectangle(int s); 
-    ~Rectangle(); 
-    void setWidth(int w); 
-    void setHeight(int h); 
-    int getWidth(); 
-    int getHeight(); 
-    int getArea(); 
-}; 
- 
-Rectangle::Rectangle() { 
-  width_ptr = new (nothrow) int;     
-  height_ptr = new (nothrow) int; 
-  if(width_ptr == NULL || height_ptr == NULL) { 
-    cerr << "Memory allocation failure!\n"; 
-    exit(-1); 
-  } 
-  *width_ptr = *height_ptr = 0; 
-  cout << "Calling 0 args constructor" << endl; 
-} 
- 
-Rectangle::Rectangle(int w, int h) : Rectangle() { 
-  *width_ptr = w; 
-  *height_ptr = h; 
-  cout << "Calling 2 args constructor" << endl; 
-} 
- 
-Rectangle::Rectangle(int s) : Rectangle(s,s) { 
-  cout << "Calling 1 args constructor" << endl; 
-} 
- 
-Rectangle::~Rectangle() { 
-  cout << "Destructing rectangle (w:"<< *width_ptr <<", h:"<<*height_ptr<<")\n"; 
-  delete width_ptr; 
-  delete height_ptr; 
-} 
- 
-void Rectangle::setWidth(int w) { *width_ptr = w; } 
-void Rectangle::setHeight(int h) { *height_ptr = h; } 
-int Rectangle::getWidth() { return *width_ptr; } 
-int Rectangle::getHeight() { return *height_ptr; } 
-int Rectangle::getArea() { return *width_ptr * *height_ptr; } 
-</code> 
  
 <WRAP tip 80% round> <WRAP tip 80% round>
cpp/object_lifecycle.txt · Last modified: 2021/05/07 06:35 (external edit)