c++11 快速退出


C++程序中有以下幾種推出方式:terminate abort exit

terminate: 實際上是c++語言中異常處理的一部分(包含在<exception>頭文件中),一般而言,沒有被捕獲的異常就會被terminate函數調用。只要c++程序中出現了非程序員預期的行為,都有可能導致terminate的調用。而terminate函數在默認情況下,是去調用abort函數的。

abort:不會調用任何的析構函數,默認情況下會想合乎POSIX標准的系統拋出一個信號:SIGABRT。abort是系統在毫無辦法的下下策——終止進程。會造成一些問題:

exit:屬於正常退出的范疇。

#include <cstdlib>
#include <iostream>
using namespace std;

void openDevice() {
  cout << "device is opened. " << endl;
}

void resetDeviceStat() {
  cout << "device stat is reset. " << endl;
}

void closeDevice() {
  cout << "device is closed. " << endl;
}

int main() {
  atexit(closeDevice);
  atexit(resetDeviceStat);
  openDevice();
  exit(0);
}

輸出為:

device is opened.

device stat is reset.

device is closed.

在程序退出時,所注冊的函數都被調用,注冊函數調用的次序與其注冊順序相反。

main或者exit函數調用會導致類的析構函數依次將這些零散的內存還給系統,這是一件費時的工作。而實際上,這些堆內存在進程結束的時候由操作系統統一回收(事實上,這非常快,操作系統除了釋放一些進程相關的數據結構外,只是將一些物理內存標記為未使用就可以了),如果這些堆內存不對其他應用程序產生影響,那么在程序結束時釋放往往是毫無意義的。

在c++11中,標准引入了quick_exit函數,該函數並不執行析構函數而只是使程序終止。quick_exit與exit同屬於正常退出。

#include <cstdlib>
#include <iostream>
using namespace std;

struct A {
  ~A() {
    cout << "Destructor A. " << endl;
  }
};

void closeDevice() {
  cout << "device is closed" << endl;
}

int main() {
  A a;
  at_quick_exit(closeDevice);
  quick_exit();
}

輸出為:

device is closed

a的析構函數不會被調用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM