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,因此能析构全部对象。

  • 相关阅读:
    图数据库查询语言
    深入探索Spring Data JPA, 从Repository 到 Specifications 和 Querydsl
    axios 浏览器内存泄露问题解决
    给Swagger换一套皮肤 Knife4j集成记录
    根据经纬度和半径计算经纬度范围
    最火 Web 前端组态软件 (可视化)
    Python-----删除给定目录下的所有文件
    Python----发送邮件yagmail
    python------将"["1","2"]"类型是字符串,转换为["1","2"]类型为列表,即eval()用法
    python----自动生成requirements.txt与导入requirements.txt中的库
  • 原文地址:https://www.cnblogs.com/liaocheng/p/4243526.html
Copyright © 2011-2022 走看看