cpp:stack_unwinding
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
cpp:stack_unwinding [2019/05/06 07:20] – created gthanos | cpp:stack_unwinding [2023/05/15 14:13] (current) – gthanos | ||
---|---|---|---|
Line 2: | Line 2: | ||
Κατά την δημιουργία ενός // | Κατά την δημιουργία ενός // | ||
+ | |||
+ | <code cpp Vector.hpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | using namespace std; | ||
+ | |||
+ | class Vector { | ||
+ | int *array; | ||
+ | int size; | ||
+ | | ||
+ | public: | ||
+ | Vector(int length=0); | ||
+ | ~Vector(); | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | <code cpp Vector.cpp> | ||
+ | #include " | ||
+ | |||
+ | 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; | ||
+ | } | ||
+ | </ | ||
<code cpp StackUnwinding.cpp> | <code cpp StackUnwinding.cpp> | ||
#include < | #include < | ||
+ | #include < | ||
+ | #include " | ||
+ | |||
+ | using namespace std; | ||
+ | |||
// called by FFF() | // called by FFF() | ||
void FFFF() { | void FFFF() { | ||
std::cout << "Start FFFF\n"; | std::cout << "Start FFFF\n"; | ||
+ | Vector v(4); | ||
std::cout << "FFFF throwing int literal exception\n"; | std::cout << "FFFF throwing int literal exception\n"; | ||
throw 100; | throw 100; | ||
Line 16: | Line 58: | ||
void FFF() { | void FFF() { | ||
std::cout << "Start FFF\n"; | std::cout << "Start FFF\n"; | ||
+ | Vector v(3); | ||
FFFF(); | FFFF(); | ||
std::cout << "End FFF\n"; | std::cout << "End FFF\n"; | ||
Line 22: | Line 65: | ||
void FF() { | void FF() { | ||
std::cout << "Start FF\n"; | std::cout << "Start FF\n"; | ||
+ | Vector v(2); | ||
try { | try { | ||
FFF(); | FFF(); | ||
} catch(char) { | } catch(char) { | ||
- | std::cerr << "FF caught | + | std::cerr << "FF caught |
} | } | ||
std::cout << "End FF\n"; | std::cout << "End FF\n"; | ||
Line 32: | Line 76: | ||
void F() { | void F() { | ||
std::cout << "Start F\n"; | std::cout << "Start F\n"; | ||
+ | Vector v(1); | ||
try { | try { | ||
FF(); | FF(); | ||
Line 37: | Line 82: | ||
| | ||
} catch (char) { | } catch (char) { | ||
- | | + | |
} | } | ||
std::cout << "End F\n"; | std::cout << "End F\n"; | ||
Line 58: | Line 103: | ||
Start main | Start main | ||
Start F | Start F | ||
+ | Create vector of size: 1 | ||
Start FF | Start FF | ||
+ | Create vector of size: 2 | ||
Start FFF | Start FFF | ||
+ | Create vector of size: 3 | ||
Start FFFF | Start FFFF | ||
+ | Create vector of size: 4 | ||
FFFF throwing int literal exception | FFFF throwing int literal exception | ||
+ | ~Destroying vector of size: 4 | ||
+ | ~Destroying vector of size: 3 | ||
+ | ~Destroying vector of size: 2 | ||
F caught int exception | F caught int exception | ||
End F | End F | ||
- | End main | + | ~Destroying vector of size: 1 |
</ | </ | ||
- | H εξέλιξη του //program stack// στο παρακάτω πρόγραμμα δίνεται στο παρακάτω διάγραμμα. Παρατηρήστε ότι το exception παράγεται στη συνάρτηση **FFFF()**, αλλά | + | Η εξέλιξη του //program stack// στο παρακάτω πρόγραμμα δίνεται στο παρακάτω διάγραμμα. Παρατηρήστε ότι το exception παράγεται στη συνάρτηση **FFFF()**, αλλά |
+ | |||
+ | Από τις εκτυπώσεις στην οθόνη, παρατηρήστε επίσης ότι όσα αντικείμενα έχουν δημιουργηθεί αυτόματα μέσα στο stack στις συναρτήσεις FF(), FFF(), FFFF() καταστρέφονται (με κλήση του αντίστοιχου καταστροφέα) και απελευθερώνεται η μνήμη που έχει δεσμευθεί για αυτά. Η διαδικασία καταστροφής των αντικειμένων γίνεται αυτόματα κατά τη διαδικασία του stack unwinding, ώστε να μην υπάρχουν απώλειες πόρων (memory leaks, περιγραφείς αρχείων ή sockets που παραμένουν ανοιχτά) μετά την διακοπή της εξαίρεσης. | ||
{{ : | {{ : | ||
cpp/stack_unwinding.1557127211.txt.gz · Last modified: 2019/05/06 06:20 (external edit)