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 revision
Previous revision
Next revisionBoth sides next revision
cpp:object_lifecycle [2020/04/14 09:01] gthanoscpp:object_lifecycle [2020/04/14 09:37] gthanos
Line 4: Line 4:
 Τα αντικείμενα που φτιάξαμε μέχρι τώρα αποθηκεύονται μέσα στη στοίβα (//stack//) της συνάρτησης που καλεί τον κατασκευαστή της. Τα αντικείμενα αυτά έχουν χρόνο ζωής όσο εκτελείται η συγκεκριμένη συνάρτηση και η στοίβα της είναι ενεργή. Μόλις επιστρέψουμε από την συνάρτηση που δημιουργεί το οποιοδήποτε αντικείμενο, αυτό καταστρέφεται αυτόματα. Εάν συντρέχουν λόγοι εκκαθάρισης μνήμης ή περιγραφέων αρχείων οφείλουμε να ορίσουμε καταστροφέα για τη συγκεκριμένη κλάση. Τα αντικείμενα που φτιάξαμε μέχρι τώρα αποθηκεύονται μέσα στη στοίβα (//stack//) της συνάρτησης που καλεί τον κατασκευαστή της. Τα αντικείμενα αυτά έχουν χρόνο ζωής όσο εκτελείται η συγκεκριμένη συνάρτηση και η στοίβα της είναι ενεργή. Μόλις επιστρέψουμε από την συνάρτηση που δημιουργεί το οποιοδήποτε αντικείμενο, αυτό καταστρέφεται αυτόματα. Εάν συντρέχουν λόγοι εκκαθάρισης μνήμης ή περιγραφέων αρχείων οφείλουμε να ορίσουμε καταστροφέα για τη συγκεκριμένη κλάση.
  
-===== Δημιουργία αντικειμένων στο Stack =====+===== 1η Περίπτωση - Δημιουργία αντικειμένων στο Stack =====
  
 Παρακάτω δίνεται ο κώδικας της συνάρτησης //foo// η οποία δημιουργεί ένα πίνακα από δύο αντικείμενα τύπου //Rectangle//. Τα αντικείμενα δημιουργούνται στο //stack// της διεργασίας που εκτελείται και έχουν χρόνο ζωής όσο διαρκεί η εκτέλεση της συνάρτησης //foo//. Μετά την έξοδο από την //foo// τα αντικείμενα //rect[0]// και //rect[1]// καταστρέφονται. Η κλάση Rectangle που δημιουργείται δίνεται παρακάτω: Παρακάτω δίνεται ο κώδικας της συνάρτησης //foo// η οποία δημιουργεί ένα πίνακα από δύο αντικείμενα τύπου //Rectangle//. Τα αντικείμενα δημιουργούνται στο //stack// της διεργασίας που εκτελείται και έχουν χρόνο ζωής όσο διαρκεί η εκτέλεση της συνάρτησης //foo//. Μετά την έξοδο από την //foo// τα αντικείμενα //rect[0]// και //rect[1]// καταστρέφονται. Η κλάση Rectangle που δημιουργείται δίνεται παρακάτω:
Line 86: Line 86:
 </code> </code>
  
-Ακολουθεί το σχηματικό διάγραμμα του //stack// της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης //foo//.+Ακολουθεί το σχηματικό διάγραμμα του //stack// της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης //foo//. Μεταγλωττίζοντας και εκτελώντας τον παραπάνω κώδικα, μπορείτε να δείτε τα μηνύματα που εκτυπώνονται και να διαπιστώσετε ότι τα δύο αντικείμενα τύπου //Rectangle// καταστρέφονται κατά την έξοδο από τη //foo//. Στο διάγραμμα δεν αποτυπώνεται η δέσμευση μνήμης για τα πεδία του κάθε αντικειμένου τύπου //Rectangle//.
  
 {{ :cpp:cppstackonly.png | Σχηματικό διάγραμμα του stack της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης foo}} {{ :cpp:cppstackonly.png | Σχηματικό διάγραμμα του stack της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης foo}}
Line 92: Line 92:
 ===== Δημιουργία αντικειμένων στο Heap ===== ===== Δημιουργία αντικειμένων στο Heap =====
  
-Υπάρχουν όμως περιπτώσεις που θέλουμε να ορίσουμε ένα αντικείμενο το οποίο θα παραμείνει και μετά την έξοδο από τη συνάρτηση που το δημιούργησε. Σε αυτές τις περιπτώσεις πρέπει α) να ορίσουμε ένα δείκτη του τύπου που θέλουμε να δημιουργήσουμε και β) να δεσμεύσουμε την απαραίτητη μνήμη και να αρχικοποιήσουμε το αντικείμενο μέσω του τελεστή //new//. Παρακάτω βλέπετε ένα παράδειγμα όπου η συνάρτηση //foo// επιστρέφει ένα αντικείμενο της κλάσης //Rectangle//.+Υπάρχουν όμως περιπτώσεις που θέλουμε να ορίσουμε ένα αντικείμενο το οποίο θα παραμείνει και μετά την έξοδο από τη συνάρτηση που το δημιούργησε. Σε αυτές τις περιπτώσεις πρέπει α) να ορίσουμε ένα δείκτη του τύπου που θέλουμε να δημιουργήσουμε και β) να δεσμεύσουμε την απαραίτητη μνήμη και να αρχικοποιήσουμε το αντικείμενο μέσω του τελεστή //new//. Παρακάτω βλέπετε ένα παράδειγμα όπου η συνάρτηση //foo// επιστρέφει ένα δείκτη σε αντικείμενο της κλάσης //Rectangle// που δημιουργήθηκε στο //heap//.
  
 <code cpp foo.cpp> <code cpp foo.cpp>
Line 100: Line 100:
  
 Rectangle* foo(int w, int h) { Rectangle* foo(int w, int h) {
-  Rectangle *rect_ptr = new Rectangle {w,h};+  Rectangle* rect_ptr = new Rectangle {w,h};
   return rect_ptr;   return rect_ptr;
 } }
Line 106: Line 106:
 int main() { int main() {
   int x=5, y=3;   int x=5, y=3;
-  Rectangle *rect = foo(x,y);+  Rectangle* rect = foo(x,y);
   cout << "x: " << x << ", y: " << y << endl;   cout << "x: " << x << ", y: " << y << endl;
   cout << "area : " << rect->getArea() << endl;   cout << "area : " << rect->getArea() << endl;
Line 113: Line 113:
 </code> </code>
  
-Ακολουθεί το σχηματικό διάγραμμα του //stack// και του //heap// της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης //foo//.+Παρατηρήστε ότι δεν χρειαζόμαστε πλέον το αντικείμενο που δεσμεύτηκε δυναμικά στο //heap// θα πρέπει να το καταστρέψουμε ελευθερώνοντας τη δεσμευμένη μνήμη με τη βοήθεια του τελεστή //delete//. Κατά την  απελευθέρωση της μνήμης μέσω του τελεστή //delete// καλείται ο καταστροφέας του αρχείου, σε αναλογία με την κλήση του κατασκευαστή με χρήση του τελεστή //new//  
 + 
 +Ακολουθεί το σχηματικό διάγραμμα του //stack// και του //heap// της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης //foo//. Στο διάγραμμα δεν αποτυπώνεται η δέσμευση μνήμης για τα πεδία του κάθε αντικειμένου τύπου //Rectangle//.
  
 {{ :cpp:cppstackheap.png | Σχηματικό διάγραμμα του stack και του heap της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης foo}} {{ :cpp:cppstackheap.png | Σχηματικό διάγραμμα του stack και του heap της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης foo}}
cpp/object_lifecycle.txt · Last modified: 2021/05/07 06:35 (external edit)