This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision | Next revision Both sides next revision | ||
|
cpp:stack_unwinding [2020/05/04 13:34] gthanos |
cpp:stack_unwinding [2021/05/25 07:56] gthanos |
||
|---|---|---|---|
| Line 7: | Line 7: | ||
| #include < | #include < | ||
| using namespace std; | using namespace std; | ||
| - | |||
| - | class Vector { | ||
| - | int *array; | ||
| - | int size; | ||
| - | | ||
| - | public: | ||
| - | Vector(int length=0); | ||
| - | ~Vector(); | ||
| - | }; | ||
| - | |||
| - | Vector:: | ||
| - | cout << " | ||
| - | size = length; | ||
| - | array = new (nothrow) int[size]; | ||
| - | if(array==NULL) { | ||
| - | cerr << " | ||
| - | exit(-1); | ||
| - | } | ||
| - | for(int i=0; i<size; i++) | ||
| - | array[i] = 0; | ||
| - | } | ||
| - | |||
| - | Vector:: | ||
| - | cout << " | ||
| - | delete [] array; | ||
| - | } | ||
| - | |||
| // called by FFF() | // called by FFF() | ||
| Line 108: | Line 81: | ||
| </ | </ | ||
| - | H εξέλιξη του //program stack// στο παρακάτω πρόγραμμα δίνεται στο παρακάτω διάγραμμα. Παρατηρήστε ότι το exception παράγεται στη συνάρτηση **FFFF()**, αλλά " | + | Η εξέλιξη του //program stack// στο παρακάτω πρόγραμμα δίνεται στο παρακάτω διάγραμμα. Παρατηρήστε ότι το exception παράγεται στη συνάρτηση **FFFF()**, αλλά " |
| Από τις εκτυπώσεις στην οθόνη, παρατηρήστε επίσης ότι όσα αντικείμενα έχουν δημιουργηθεί αυτόματα μέσα στο stack στις συναρτήσεις FF(), FFF(), FFFF() καταστρέφονται (με κλήση του αντίστοιχου καταστροφέα) και απελευθεώνεται η μνήμη που έχει δεσμευθεί για αυτά. Η διαδικασία καταστροφής των αντικειμένων γίνεται αυτόματα κατά τη διαδικασία του stack unwinding, ώστε να μην υπάρχουν απώλειες πόρων (memory leaks, περιγραφείς αρχείων ή sockets που παραμένουν ανοιχτά) μετά την διακοπή της εξαίρεσης. | Από τις εκτυπώσεις στην οθόνη, παρατηρήστε επίσης ότι όσα αντικείμενα έχουν δημιουργηθεί αυτόματα μέσα στο stack στις συναρτήσεις FF(), FFF(), FFFF() καταστρέφονται (με κλήση του αντίστοιχου καταστροφέα) και απελευθεώνεται η μνήμη που έχει δεσμευθεί για αυτά. Η διαδικασία καταστροφής των αντικειμένων γίνεται αυτόματα κατά τη διαδικασία του stack unwinding, ώστε να μην υπάρχουν απώλειες πόρων (memory leaks, περιγραφείς αρχείων ή sockets που παραμένουν ανοιχτά) μετά την διακοπή της εξαίρεσης. | ||