| 特性 | return | exit() |
|---|---|---|
| 所屬層級 | 語言關鍵字/語句 | 標準庫函數 ( |
| 作用範圍 | 離開當前函數 | 終止整個程式 |
| main()中行為 | 返回值給作業系統,結束程式 | 直接終止程式,返回值給作業系統 |
| 非main函數 | 返回呼叫者繼續執行 | 強制結束整個程式,不返回 |
| 區域物件解構 | 正常調用解構函數 | 不調用當前函數區域物件解構函數 |
| 全域/靜態物件 | 程式正常結束時調用 | 調用atexit()登記函數與全域物件解構 |
| 緩衝區刷新 | 正常刷新 | 刷新標準I/O緩衝區 |
| 參數型別 | 需符合函數回傳型別 | 僅接受int狀態碼 |
#include
using namespace std;
class Test {
public:
Test(const char* n) : name(n) { cout << "建構: " << name << endl; }
~Test() { cout << "解構: " << name << endl; }
const char* name;
};
void func_exit() {
Test obj("func_exit區域物件");
exit(0); // 程式直接結束,obj解構函數「不會」被呼叫
}
void func_return() {
Test obj("func_return區域物件");
return; // 正常返回,obj解構函數「會」被呼叫
}
int main() {
Test g_obj("main區域物件");
// func_exit(); // 註解切換測試
func_return();
cout << "main結束" << endl;
return 0;
}
輸出對比:
func_exit():建構: main區域物件 → 建構: func_exit區域物件 → (程式結束,無解構輸出)func_return():建構: main區域物件 → 建構: func_return區域物件 → 解構: func_return區域物件 → main結束 → 解構: main區域物件在main()中,return n;與exit(n);對作業系統傳回的結束碼效果相同,但return仍會正常解構main內區域物件,exit則跳過。
void main() {
// return; // 錯誤:void函數不可返回值
exit(1); // 合法:可傳遞結束碼給OS
}
標準C++要求main回傳int,但某些編譯器允許void main(),此時exit()成為傳遞結束碼的唯一方式。
void main()需傳遞結束碼、信號處理器中終止程式atexit()、不刷新緩衝區、產生核心傾印,僅用於極度嚴重錯誤exit(),保持堆疊展開與物件解構main() 標準寫法:int main() { ... return 0; }return是函數控制流的正常轉移,配合C++ RAII機制保證資源安全釋放;exit()是程式層級的緊急停止開關,繞過區域物件解構,僅在極少數無法恢復的嚴重錯誤或特殊環境限制下使用。現代C++開發應堅持「以return/例外處理錯誤,避免exit()」原則。