Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth 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; |
} | } |