เป็นไปได้ไหมที่จะยุติการทำงานของซอฟต์แวร์โดยไม่ข้ามการเรียกไปยังตัวทำลาย? ตัวอย่างเช่น ในโค้ดด้านล่าง destructor สำหรับ test
จะไม่ถูกเรียกเนื่องจากคำสั่ง exit(1)
#include <iostream>
#include <cstdlib>
using namespace std;
class A{
public:
A(){cout << "Constructed.\n";}
~A(){cout << "Destroyed.\n";}
};
void func()
{
//Assuming something went wrong:
exit(1);
}
int main(int argc, char *argv[])
{
A test;
func();
return 0;
}
สิ่งที่ฉันต้องการคือวิธีจบโปรแกรม (จากภายใน func()
) ที่เรียกตัวทำลายล้างที่จำเป็นทั้งหมดก่อนที่จะยุติ จนถึงตอนนี้ฉันได้จัดการสิ่งนี้ผ่าน func()
ค่าส่งคืน เช่นเดียวกับใน:
bool func()
{
//Assuming something went wrong:
return false;
}
int main(int argc, char *argv[])
{
A test;
if( !func() )return 1;
return 0;
}
ปัญหาของวิธีนี้คือมันจะกลายเป็นเรื่องน่ารำคาญอย่างรวดเร็ว (และโค้ดบวม) ในการจัดการอย่างรวดเร็วเมื่อคุณต้องการนำไปใช้กับชุดของฟังก์ชันที่ซ้อนกัน
มีวิธีใดในการบรรลุผลลัพธ์เดียวกันของตัวอย่างที่สอง (การเรียก destructor ที่เหมาะสม) โดยมีไวยากรณ์คล้ายกับตัวอย่างแรก (โทร exit(1)
ไม่ว่าคุณจะอยู่ที่ไหน)
exit
; แทนที่จะส่งข้อยกเว้นและจับมันที่ระดับmain
- person Kerrek SB   schedule 29.11.2011