cpp:copy_constructors
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
cpp:copy_constructors [2022/05/12 18:58] – [Ορισμός ενός κατασκευαστή αντιγραφέα] gthanos | cpp:copy_constructors [2022/05/12 19:41] (current) – [Πιο σύνθετες περιπτώσεις] gthanos | ||
---|---|---|---|
Line 176: | Line 176: | ||
</ | </ | ||
- | ===== Μια πιο σύνθετη περίπτωση | + | ===== Πιο σύνθετες περιπτώσεις ===== |
+ | |||
+ | ==== 1η Περίπτωση | ||
Στις περιπτώσεις που υπάρχουν πεδία που είναι δείκτες και δείχνουν σε άλλα αντικείμενα (στατικά ή δυναμικά δεσμευμένα) εάν δεν ορίσετε τον δικό σας κατασκευαστή αντιγραφέα, | Στις περιπτώσεις που υπάρχουν πεδία που είναι δείκτες και δείχνουν σε άλλα αντικείμενα (στατικά ή δυναμικά δεσμευμένα) εάν δεν ορίσετε τον δικό σας κατασκευαστή αντιγραφέα, | ||
Line 239: | Line 241: | ||
Point *getOrigin() const; | Point *getOrigin() const; | ||
}; | }; | ||
+ | </ | ||
+ | |||
+ | <code cpp Rectangle.cpp> | ||
+ | #include " | ||
Rectangle:: | Rectangle:: | ||
Line 270: | Line 276: | ||
</ | </ | ||
- | <code cpp MoveOrigin.cpp> | + | <code cpp CopyRectangle.cpp> |
#include " | #include " | ||
- | |||
- | int moveOrigin(Rectangle &r, int dx, int dy) { | ||
- | Point *p = r.getOrigin(); | ||
- | p-> | ||
- | p-> | ||
- | } | ||
int main() { | int main() { | ||
Line 283: | Line 283: | ||
Rectangle r1{5, | Rectangle r1{5, | ||
Rectangle r2 = r1; | Rectangle r2 = r1; | ||
- | Rectangle r3(r1); | ||
- | | ||
- | moveOrigin(r1, | ||
} | } | ||
</ | </ | ||
Line 294: | Line 291: | ||
< | < | ||
- | *** Error in `./ | + | free(): |
- | Ακυρώθηκε | + | Aborted |
</ | </ | ||
Line 319: | Line 316: | ||
</ | </ | ||
+ | ==== 2η Περίπτωση - Κλήση συνάρτησης με παράμετρο αντικείμενο που περιέχει δυναμικά δεσμευμένα πεδία ==== | ||
+ | |||
+ | <code cpp MoveOrigin.cpp> | ||
+ | #include " | ||
+ | |||
+ | int moveOrigin(Rectangle r, int dx, int dy) { | ||
+ | Point *p = r.getOrigin(); | ||
+ | p-> | ||
+ | p-> | ||
+ | } | ||
+ | |||
+ | int main() { | ||
+ | Point p{5,5}; | ||
+ | Rectangle r1{5, | ||
+ | | ||
+ | moveOrigin(r1, | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Η κλήση της συνάρτησης moveOrigin θα απαιτήσει τη δημιουργία ενός αντιγράφου του r1 στο stack για τις ανάγκες της εκτέλεσης της συγκεκριμένης συνάρτησης. Εφόσον δεν έχουμε δημιουργήσει κατασκευαστή αντιγραφέα, | ||
+ | |||
+ | Κατά την έξοδο από τη συνάρτηση η κοινή αυτή περιοχή θα καταστραφεί, | ||
+ | |||
+ | < | ||
+ | free(): double free detected in tcache 2 | ||
+ | Aborted (core dumped) | ||
+ | </ | ||
+ | |||
+ | Η δημιουργία του κατασκευαστή αντιγραφέα που προτάθηκε παραπάνω λύνει και αυτό το πρόβλημα. |
cpp/copy_constructors.1652381901.txt.gz · Last modified: 2022/05/12 18:58 by gthanos