cpp:stack_unwinding

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revision Both sides next revision
cpp:stack_unwinding [2019/05/06 07:20]
gthanos created
cpp:stack_unwinding [2021/05/25 07:56]
gthanos
Line 5: Line 5:
 <code cpp StackUnwinding.cpp> <code cpp StackUnwinding.cpp>
 #include <iostream> #include <iostream>
 +#include <cstdlib>
 +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 20:
 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 27:
 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 double exception\n";+    std::cerr << "FF caught char exception\n";
   }   }
   std::cout << "End FF\n";   std::cout << "End FF\n";
Line 32: Line 38:
 void F() { void F() {
   std::cout << "Start F\n";   std::cout << "Start F\n";
 +  Vector v(1);
   try {   try {
     FF();     FF();
Line 37: Line 44:
      std::cerr << "F caught int exception\n";      std::cerr << "F caught int exception\n";
   } catch (char) {   } catch (char) {
-     std::cerr << "F caught double exception\n";+     std::cerr << "F caught char exception\n";
   }   }
   std::cout << "End F\n";   std::cout << "End F\n";
Line 58: Line 65:
 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
 </code> </code>
  
-εξέλιξη του //program stack// στο παρακάτω πρόγραμμα δίνεται στο παρακάτω διάγραμμα. Παρατηρήστε ότι το exception παράγεται στη συνάρτηση **FFFF()**, αλλά "πιάνεται" στην **F()** πράγμα που συνεπάγεται την αυτόματη συρρίκνωση του //stack// στο επίπεδο της συνάρτησης **F()**. Μετά το "πιάσιμο" του //exception//, τα περιεχόμενα του //stack// για τις συναρτήσεις **FFF()** και **FFFF()** έχουν χαθεί.+Η εξέλιξη του //program stack// στο παρακάτω πρόγραμμα δίνεται στο παρακάτω διάγραμμα. Παρατηρήστε ότι το exception παράγεται στη συνάρτηση **FFFF()**, αλλά "πιάνεται" στην **F()** πράγμα που συνεπάγεται την αυτόματη συρρίκνωση του //stack// στο επίπεδο της συνάρτησης **F()**. Μετά το "πιάσιμο" του //exception//, τα περιεχόμενα του //stack// για τις συναρτήσεις **FFFF()**, **FFF()**και **FF()** έχουν χαθεί.  
 + 
 +Από τις εκτυπώσεις στην οθόνη, παρατηρήστε επίσης ότι όσα αντικείμενα έχουν δημιουργηθεί αυτόματα μέσα στο stack στις συναρτήσεις FF(), FFF(), FFFF() καταστρέφονται (με κλήση του αντίστοιχου καταστροφέα) και απελευθεώνεται η μνήμη που έχει δεσμευθεί για αυτά. Η διαδικασία καταστροφής των αντικειμένων γίνεται αυτόματα κατά τη διαδικασία του stack unwinding, ώστε να μην υπάρχουν απώλειες πόρων (memory leaks, περιγραφείς αρχείων ή sockets που παραμένουν ανοιχτά) μετά την διακοπή της εξαίρεσης.
  
 {{ :cpp:stack_unwinding.png |}} {{ :cpp:stack_unwinding.png |}}
  
cpp/stack_unwinding.txt · Last modified: 2023/05/15 14:13 by gthanos