ที่นี่เราจะเห็นความหมายของการคลี่คลายกองคืออะไร เมื่อเราเรียกใช้ฟังก์ชันบางอย่าง จะเก็บที่อยู่ไว้ใน call stack และหลังจากกลับมาจากฟังก์ชันแล้ว จะแสดงที่อยู่เพื่อเริ่มทำงานในตำแหน่งที่เหลือ
การคลายสแต็กเป็นกระบวนการที่รายการสแต็กการเรียกใช้ฟังก์ชันจะถูกลบออกเมื่อรันไทม์ ในการลบองค์ประกอบสแต็ก เราสามารถใช้ข้อยกเว้นได้ หากมีข้อยกเว้นจากฟังก์ชันภายใน รายการทั้งหมดของสแต็กจะถูกลบออก และกลับสู่ฟังก์ชันผู้เรียกใช้หลัก
ให้เราดูผลของการคลายสแต็กผ่านตัวอย่าง
โค้ดตัวอย่าง
#include <iostream>
using namespace std;
void function1() throw (int) { //this function throws exception
cout<<"\n Entering into function 1";
throw 100;
cout<<"\n Exiting function 1";
}
void function2() throw (int) { //This function calls function 1
cout<<"\n Entering into function 2";
function1();
cout<<"\n Exiting function 2";
}
void function3() { //function to call function2, and handle
exception thrown by function1
cout<<"\n Entering function 3 ";
try {
function2(); //try to execute function 2
}
catch(int i) {
cout<<"\n Caught Exception: "<<i;
}
cout<<"\n Exiting function 3";
}
int main() {
function3();
return 0;
} ผลลัพธ์
Entering function 3 Entering into function 2 Entering into function 1 Caught Exception: 100 Exiting function 3
ที่นี่เราจะเห็นว่าตัวควบคุมเก็บข้อมูลของ function3 จากนั้นเข้าสู่ function2 แล้วจึงเข้าสู่ function1 หลังจากนั้นมีข้อยกเว้นหนึ่งรายการ จึงลบข้อมูลทั้งหมดออกจากสแต็ก และกลับสู่ function3 อีกครั้ง