zoukankan      html  css  js  c++  java
  • Windows下return,exit和ExitProcess的区别和分析

    通常,我们为了使自己的程序结束,会在主函数中使用return或调用exit()。在windows下还有ExitProcess()和TerminateProcess()等函数。

    本文的目的是比较以上几种结束程序的方式的区别,并分析其原理。

    首先我们用一个例子来说明几种结束方式的区别。

    测试代码如下:
    #include
    #include
    #include

    class Test
    {
    public:
     Test (int i) {m_i=i; printf ("construct %d ", m_i);};
     ~Test () {printf ("destruct %d ", m_i);};
    private:
     int m_i;
    };

    Test t_1 (1);

    int main(int argc, char* argv[])
    {
     Test t_2 (2);
     printf("Hello World! ");
    // return 0;
    // exit (0);
    // ExitProcess (0);
    }

    我们的目标是察看两种结束方式有什么不同。

    程序在运行的结果为:

    使用return 0结束时:
    construct 1
    construct 2
    Hello World!
    destruct 2
    destruct 1

    使用exit (0)结束时:
    construct 1
    construct 2
    Hello World!
    destruct 1

    使用ExitProcess (0)结束时:
    construct 1
    construct 2
    Hello World!

    从结果上我们可以看出来,采用return来结束进程可以正确的析构全局和局部对象。而采用exit()来结束进程时全局对象可以正确析构,但局部对象没有正确析构。采用ExitProcess(0)结束时全局和局部对象都没有正确析构。

    为什么会出现这样的情况呢?
    《Windows核心编程》中我们可以得到以下解释:
    "当主线程的进入点函数(WinMain、wWinMain、main或wmain)返回时,它将返回给C/C++运行期启动代码,它能够正确地清楚该进程使用的所有C运行期资源。当C运行期资源被释放之后,C运行期启动代码就显式的调用ExitProcess,并将进入点函数返回的值传递给它。"

    在Windows下,return 0 的实际执行过程是: 

    • 先析构main函数内的局部对象。

    • 返回至调用main的函数。

    • 调用exit函数,由exit函数调用doexit函数,在doexit函数中完成对全局对象的析构。

    • 最后调用ExitProcess结束进程。

    所以,ExitProcess不负责任何对象的析构,exit只负责析构全局对象,return 0可以析构局部对象并调用exit,因此能析构全部对象。

  • 相关阅读:
    Run
    axios+Qs请求数据转表单格式
    Vue开发电子书app
    vue2.5开发去哪儿了流程
    ES6重度学习 demo实例
    JS 数组, 对象的增查改删(多语法对比)
    格式化时间戳的n种方法
    Vue中你忽略的点
    vscode代码格式化
    分隔符
  • 原文地址:https://www.cnblogs.com/liaocheng/p/4243526.html
Copyright © 2011-2022 走看看