zoukankan      html  css  js  c++  java
  • 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的析构函数不会被调用。

  • 相关阅读:
    mac攻略(八) -- 神器zsh和iterm2的配置
    linux学习(二) -- ubuntu下lnmp环境的配置
    linux学习(一) -- ubuntu下lamp环境的配置
    算法学习(一) -- 基本算法
    laravel5.2总结--数据填充
    laravel5.2总结--数据迁移
    laravel5.2总结--redis使用
    laravel5.2总结--关联关系
    mac攻略(七) -- 环境变量PATH分析
    mac攻略(六) -- mac根目录分析
  • 原文地址:https://www.cnblogs.com/sssblog/p/11452164.html
Copyright © 2011-2022 走看看