| Both sides previous revision
Previous revision
Next revision
|
Previous revision
Next revision
Both sides next revision
|
cpp:object_lifecycle [2020/04/14 14:30] gthanos [Ένα πιο σύνθετο παράδειγμα αρχικοποίησης δεικτών] |
cpp:object_lifecycle [2021/05/07 07:33] gthanos [Ένα πιο σύνθετο παράδειγμα αρχικοποίησης δεικτών] |
| |
| ====== Κύκλος ζωής των αντικειμένων - Δημιουργία και ανάθεση αντικειμένων στο heap ====== | ====== Κύκλος ζωής των αντικειμένων - Δημιουργία αντικειμένων μέσω δυναμικής δέσμευσης μνήμης ====== |
| |
| Παρακάτω δίνεται ο κώδικας της κλάσης //Rectangle// τον οποίο θα χρησιμοποιήσουμε για να μεταγλωττίσουμε και να εκτελέσουμε τα παραδείγματα που ακολουθούν. Η παρούσα κλάση αποτελείται από δύο πεδία τύπου int* (για την αποθήκευση του width και του height αντιστοίχως). Κατά την κατασκευή ενός αντικειμένου θα πρέπει απαραίτητα να δεσμεύεται ο απαιτούμενος χώρος για την αποθήκευση των τιμών του πλάτους και του ύψους. Κατά την καταστροφή του αντικειμένου ο χώρος που δεσμεύτηκε θα πρέπει να αποδεσμευθεί στον καταστροφέα. | Παρακάτω δίνεται ο κώδικας της κλάσης //Rectangle// τον οποίο θα χρησιμοποιήσουμε για να μεταγλωττίσουμε και να εκτελέσουμε τα παραδείγματα που ακολουθούν. Η παρούσα κλάση αποτελείται από δύο πεδία τύπου int* (για την αποθήκευση του width και του height αντιστοίχως). Κατά την κατασκευή ενός αντικειμένου θα πρέπει απαραίτητα να δεσμεύεται ο απαιτούμενος χώρος για την αποθήκευση των τιμών του πλάτους και του ύψους. Κατά την καταστροφή του αντικειμένου ο χώρος που δεσμεύτηκε θα πρέπει να αποδεσμευτεί στον καταστροφέα. |
| |
| <code cpp Rectangle.hpp> | <code cpp Rectangle.hpp> |
| } | } |
| </code> | </code> |
| |
| Όταν δεν χρειαζόμαστε πλέον το αντικείμενο που δεσμεύτηκε δυναμικά στο //heap// θα πρέπει να το καταστρέψουμε ελευθερώνοντας τη δεσμευμένη μνήμη με τη βοήθεια του τελεστή //delete//. Κατά την απελευθέρωση της μνήμης μέσω του τελεστή //delete// καλείται ο καταστροφέας της κλάσης, σε αναλογία με την κλήση του κατασκευαστή της κλάσης με χρήση του τελεστή //new//. | |
| |
| Ακολουθεί το σχηματικό διάγραμμα του //stack// και του //heap// της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης //foo//. Στο διάγραμμα δεν αποτυπώνεται η δέσμευση μνήμης για τα πεδία //width// και //height// του κάθε αντικειμένου τύπου //Rectangle//. | Ακολουθεί το σχηματικό διάγραμμα του //stack// και του //heap// της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης //foo//. Στο διάγραμμα δεν αποτυπώνεται η δέσμευση μνήμης για τα πεδία //width// και //height// του κάθε αντικειμένου τύπου //Rectangle//. |
| {{ :cpp:cppstackheap.png | Σχηματικό διάγραμμα του stack και του heap της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης foo}} | {{ :cpp:cppstackheap.png | Σχηματικό διάγραμμα του stack και του heap της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης foo}} |
| |
| ===== Ένα πιο σύνθετο παράδειγμα αρχικοποίησης δεικτών ===== | Όταν δεν χρειαζόμαστε πλέον το αντικείμενο που δεσμεύτηκε δυναμικά στο //heap// θα πρέπει να το καταστρέψουμε ελευθερώνοντας τη δεσμευμένη μνήμη με τη βοήθεια του τελεστή //delete//. Κατά την απελευθέρωση της μνήμης μέσω του τελεστή //delete// καλείται ο καταστροφέας της κλάσης, σε αναλογία με την κλήση του κατασκευαστή της κλάσης με χρήση του τελεστή //new//. |
| | |
| | ===== 3η περίπτωση - δυναμικά δεσμευμένοι μονοδιάστατοι πίνακες από αντικείμενα ===== |
| |
| Παρακάτω δίνεται η κλάση //Rectangle// και ένα παράδειγμα αρχικοποίησης των τριών δεικτών //r1, r2, r3// τύπου //Rectangle//, οι οποίοι αρχικοποιούνται ως εξής: | Παρακάτω δίνεται η κλάση //Rectangle// και ένα παράδειγμα αρχικοποίησης των τριών δεικτών //r1, r2, r3// τύπου //Rectangle//, οι οποίοι αρχικοποιούνται ως εξής: |
| cout << "---------------" << endl; | cout << "---------------" << endl; |
| | |
| delete[] r4[0]; | delete[] r4[0]; // Call the destructor of Rectangle for all elements in row 0. |
| delete[] r4[1]; | delete[] r4[1]; // Call the destructor of Rectangle for all elements in row 1. |
| delete[] r4; | delete[] r4; |
| } | } |