cpp:object_lifecycle
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
cpp:object_lifecycle [2020/04/14 14:00] – gthanos | cpp:object_lifecycle [2021/05/07 07:33] – [Ένα πιο σύνθετο παράδειγμα αρχικοποίησης δεικτών] gthanos | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Κύκλος ζωής των αντικειμένων - Δημιουργία | + | ====== Κύκλος ζωής των αντικειμένων - Δημιουργία αντικειμένων |
- | Παρακάτω δίνεται ο κώδικας της κλάσης // | + | Παρακάτω δίνεται ο κώδικας της κλάσης // |
<code cpp Rectangle.hpp> | <code cpp Rectangle.hpp> | ||
Line 134: | Line 134: | ||
} | } | ||
</ | </ | ||
- | |||
- | Όταν δεν χρειαζόμαστε πλέον το αντικείμενο που δεσμεύτηκε δυναμικά στο //heap// θα πρέπει να το καταστρέψουμε ελευθερώνοντας τη δεσμευμένη μνήμη με τη βοήθεια του τελεστή //delete//. Κατά την | ||
Ακολουθεί το σχηματικό διάγραμμα του //stack// και του //heap// της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης //foo//. Στο διάγραμμα δεν αποτυπώνεται η δέσμευση μνήμης για τα πεδία //width// και //height// του κάθε αντικειμένου τύπου // | Ακολουθεί το σχηματικό διάγραμμα του //stack// και του //heap// της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης //foo//. Στο διάγραμμα δεν αποτυπώνεται η δέσμευση μνήμης για τα πεδία //width// και //height// του κάθε αντικειμένου τύπου // | ||
Line 141: | Line 139: | ||
{{ : | {{ : | ||
- | ===== Ένα πιο σύνθετο | + | Όταν δεν χρειαζόμαστε |
+ | |||
+ | ===== 3η περίπτωση - δυναμικά | ||
Παρακάτω δίνεται η κλάση // | Παρακάτω δίνεται η κλάση // | ||
Line 147: | Line 147: | ||
- ο δείκτης //r2// δείχνει σε ένα αντικείμενο που αρχικοποιείται στο //heap//. | - ο δείκτης //r2// δείχνει σε ένα αντικείμενο που αρχικοποιείται στο //heap//. | ||
- ο δείκτης //r3// δείχνει σε ένα πίνακα από αντικείμενα που αρχικοποιείται επίσης στο //heap//. | - ο δείκτης //r3// δείχνει σε ένα πίνακα από αντικείμενα που αρχικοποιείται επίσης στο //heap//. | ||
- | | + | - πριν την ολοκλήρωση του προγράμματος πρέπει να ελευθερώσουμε τη μνήμη που δεσμεύτηκε στο //heap// κατά τη δημιουργία των αντικειμένων στα οποία δείχνουν οι δείκτες //r2, r3 και r4//. |
- | | + | |
- | + | <code cpp RectangleUsage-1.cpp> | |
- | <code cpp RectangleUsage1.cpp> | + | |
#include < | #include < | ||
using namespace std; | using namespace std; | ||
Line 190: | Line 188: | ||
</ | </ | ||
- | Μεταγλωττίστε και εκτελέστε τον παραπάνω κώδικα. | + | Μεταγλωττίστε και εκτελέστε τον παραπάνω κώδικα. |
< | < | ||
Calling 0 args constructor | Calling 0 args constructor | ||
Line 216: | Line 214: | ||
</ | </ | ||
+ | Παρατηρήστε ότι στον πίνακα //r3// πρώτα καταστρέφεται το αντικείμενο //r3[1]// και στη συνέχεια το αντικείμενο //r3[0]//. | ||
===== Ένα ακόμη πιο σύνθετο παράδειγμα αρχικοποίησης δεικτών ===== | ===== Ένα ακόμη πιο σύνθετο παράδειγμα αρχικοποίησης δεικτών ===== | ||
- | Παρακάτω δίνεται η κλάση // | + | Παρακάτω δίνεται η κλάση // |
+ | |||
+ | <code cpp RectangleUsage-2.cpp> | ||
+ | #include < | ||
+ | using namespace std; | ||
+ | #include " | ||
+ | |||
+ | /* Δημιουργώ ένα δυναμικά δεσμευμένο | ||
+ | * διδιάστατο πίνακα από αντικείμενα | ||
+ | * τύπου Rectangle. | ||
+ | */ | ||
+ | |||
+ | int main() { | ||
+ | |||
+ | Rectangle **r4; | ||
+ | cout << "--- init r4 ---" << endl; | ||
+ | r4 = new Rectangle*[2]; | ||
+ | cout << "--- init r4[0] ---" << endl; | ||
+ | r4[0] = new Rectangle[2] {{5,6}, {7,8}}; | ||
+ | cout << "--- init r4[1] ---" << endl; | ||
+ | r4[1] = new Rectangle[3] {{9}, {10}, {11,10}}; | ||
+ | |||
+ | cout << " | ||
+ | cout << " | ||
+ | cout << " | ||
+ | cout << " | ||
+ | cout << " | ||
+ | cout << " | ||
+ | cout << " | ||
+ | |||
+ | delete[] r4[0]; | ||
+ | delete[] r4[1]; | ||
+ | delete[] r4; | ||
+ | } | ||
+ | </ | ||
cpp/object_lifecycle.txt · Last modified: 2021/05/07 06:35 (external edit)