首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 的 exit 與析構函數:構造函數中調用 exit 導致析構函數不執行

     編輯:關於C++

實驗代碼

class mycs {
public:
mycs() { cout << "構造函數" << endl; exit(1); }
~mycs() { cout << "析構函數" << endl; }
};
mycs cs; // 全局對象
int main() { return 0; }

現象

輸出僅「構造函數」,析構函數不執行。若 exit 放在其他位置(如 main 中),析構函數正常執行。

原因分析

  • exit() 立即終止進程,將控制權交還作業系統。
  • 全局/靜態對象的析構函數在 main 返回後、進程退出前由 C++ 運行時自動調用。
  • 構造函數中調用 exit 繞過了正常的程序退出流程,運行時沒機會調用已構造對象的析構函數。

教訓

  • 避免在構造函數(尤其是全局/靜態對象)中調用 exit、abort、_Exit 等直接終止進程的函數。
  • 若需在構造失敗時退出,應拋出異常,讓上層捕獲並決定如何處理,保證 RAII 機制正常工作。
  • atexit 註冊的函數在 exit 時會被調用,但 C++ 對象析構不在其列。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved