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的析构函数不会被调用。

posted @ 2019-09-03 11:53  c++11  阅读(1830)  评论(1编辑  收藏  举报