cpp:stack_unwinding

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
cpp:stack_unwinding [2019/05/06 08:12]
gthanos
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// για τις συναρτήσεις **FFFF()**, **FFF()**και **FF()** έχουν χαθεί.+Η εξέλιξη του //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