cpp:object_lifecycle
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
cpp:object_lifecycle [2021/05/07 07:27] – gthanos | cpp:object_lifecycle [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 | ||
---|---|---|---|
Line 83: | Line 83: | ||
</ | </ | ||
- | ===== 1η Περίπτωση - Δημιουργία αντικειμένων στο Stack ===== | + | ===== 1η περίπτωση - Δημιουργία αντικειμένων στο Stack ===== |
Τα αντικείμενα στο τρέχον παράδειγμα αποθηκεύονται μέσα στη στοίβα (//stack//) της συνάρτησης που καλεί τον κατασκευαστή της. Τα αντικείμενα αυτά έχουν χρόνο ζωής όσο εκτελείται η συγκεκριμένη συνάρτηση και η στοίβα της είναι ενεργή. Μόλις επιστρέψουμε από την συνάρτηση που δημιουργεί το οποιοδήποτε αντικείμενο, | Τα αντικείμενα στο τρέχον παράδειγμα αποθηκεύονται μέσα στη στοίβα (//stack//) της συνάρτησης που καλεί τον κατασκευαστή της. Τα αντικείμενα αυτά έχουν χρόνο ζωής όσο εκτελείται η συγκεκριμένη συνάρτηση και η στοίβα της είναι ενεργή. Μόλις επιστρέψουμε από την συνάρτηση που δημιουργεί το οποιοδήποτε αντικείμενο, | ||
Line 112: | Line 112: | ||
{{ : | {{ : | ||
- | ===== 2η Περίπτωση - Δημιουργία αντικειμένων στο Heap ===== | + | ===== 2η περίπτωση - Δημιουργία αντικειμένων στο Heap ===== |
Υπάρχουν περιπτώσεις που θέλουμε να ορίσουμε ένα αντικείμενο το οποίο θα παραμείνει και μετά την έξοδο από τη συνάρτηση που το δημιούργησε. Σε αυτές τις περιπτώσεις πρέπει α) να ορίσουμε ένα δείκτη του τύπου του αντικείμενου που θέλουμε να δημιουργήσουμε και β) να δεσμεύσουμε την απαραίτητη μνήμη και να αρχικοποιήσουμε το αντικείμενο μέσω του τελεστή //new//. Παρακάτω βλέπετε ένα παράδειγμα όπου η συνάρτηση //foo// επιστρέφει ένα δείκτη σε αντικείμενο της κλάσης // | Υπάρχουν περιπτώσεις που θέλουμε να ορίσουμε ένα αντικείμενο το οποίο θα παραμείνει και μετά την έξοδο από τη συνάρτηση που το δημιούργησε. Σε αυτές τις περιπτώσεις πρέπει α) να ορίσουμε ένα δείκτη του τύπου του αντικείμενου που θέλουμε να δημιουργήσουμε και β) να δεσμεύσουμε την απαραίτητη μνήμη και να αρχικοποιήσουμε το αντικείμενο μέσω του τελεστή //new//. Παρακάτω βλέπετε ένα παράδειγμα όπου η συνάρτηση //foo// επιστρέφει ένα δείκτη σε αντικείμενο της κλάσης // | ||
Line 134: | Line 134: | ||
} | } | ||
</ | </ | ||
- | |||
- | Όταν δεν χρειαζόμαστε πλέον το αντικείμενο που δεσμεύτηκε δυναμικά στο //heap// θα πρέπει να το καταστρέψουμε ελευθερώνοντας τη δεσμευμένη μνήμη με τη βοήθεια του τελεστή //delete//. Κατά την | ||
Ακολουθεί το σχηματικό διάγραμμα του //stack// και του //heap// της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης //foo//. Στο διάγραμμα δεν αποτυπώνεται η δέσμευση μνήμης για τα πεδία //width// και //height// του κάθε αντικειμένου τύπου // | Ακολουθεί το σχηματικό διάγραμμα του //stack// και του //heap// της διεργασίας πριν, κατά τη διάρκεια και μετά την εκτέλεσης της συνάρτησης //foo//. Στο διάγραμμα δεν αποτυπώνεται η δέσμευση μνήμης για τα πεδία //width// και //height// του κάθε αντικειμένου τύπου // | ||
Line 141: | Line 139: | ||
{{ : | {{ : | ||
- | ===== Ένα πιο σύνθετο | + | Όταν δεν χρειαζόμαστε |
+ | |||
+ | ===== 3η περίπτωση - δυναμικά | ||
Παρακάτω δίνεται η κλάση // | Παρακάτω δίνεται η κλάση // | ||
Line 215: | Line 215: | ||
Παρατηρήστε ότι στον πίνακα //r3// πρώτα καταστρέφεται το αντικείμενο //r3[1]// και στη συνέχεια το αντικείμενο //r3[0]//. | Παρατηρήστε ότι στον πίνακα //r3// πρώτα καταστρέφεται το αντικείμενο //r3[1]// και στη συνέχεια το αντικείμενο //r3[0]//. | ||
- | ===== Ένα ακόμη πιο σύνθετο παράδειγμα αρχικοποίησης δεικτών ===== | ||
- | Παρακάτω δίνεται η κλάση // | + | ===== 4η περίπτωση - δυναμικά δεσμευμένοι διδιάστατοι πίνακες από αντικείμενα ===== |
+ | |||
+ | Παρακάτω δίνεται η κλάση // | ||
<code cpp RectangleUsage-2.cpp> | <code cpp RectangleUsage-2.cpp> | ||
Line 247: | Line 248: | ||
cout << " | cout << " | ||
| | ||
- | delete[] r4[0]; | + | delete[] r4[0]; |
- | delete[] r4[1]; | + | delete[] r4[1]; |
delete[] r4; | delete[] r4; | ||
} | } |
cpp/object_lifecycle.1620372442.txt.gz · Last modified: 2021/05/07 06:27 (external edit)