Windows开发:退出程序

介绍

Windows程序开发的过程中,经常会遇到程序退出问题,我们需要了解各种进程退出的方式,找到适合我们使用的退出情况。

在实际开发中我们会遇到的进程退出情况:

  1. GUI程序退出,在主线程中,我们一般退出消息循环,然后就可以正常走return退出。但是在非主线程,我们可以同步到主线程中退出。
  2. 退出释放资源太多,也没有什么必要的释放,这种情况下,可以不用采用常规的退出,采用exit,ExitProcess,TerminateProcess等方式退出。
  3. 在使用return退出或者exit退出时,会遇到部分资源未释放,退出异常崩溃(线程等未释放等情况),可以采用ExitProcess和TerminateProcess等。
  4. 通常情况下,我们会将一些资源释放放在析构函数中,所以退出时要考虑到是否会被执行到。

程序的进程退出方式与操作系统和编译环境有关,一般情况下可以通过以下几种方式退出进程:

  • return语句退出进程
  • exit函数退出进程
  • ExitProcess函数退出进程
  • TerminateProcess函数退出进程

另外,不管使用什么方式退出进程,只要进程退出后,进程所有的系统资源将被系统回收(包括非正常退出),但需要在退出前自己清理资源

return语句退出进程

在main函数中使用return语句来退出进程。通常return 0表示程序正常退出,而其他非零值表示程序出现了错误。当main函数执行完成后,进程将自动退出

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

  • 先析构main函数内的局部对象。
  • 返回至调用main的函数。
  • 调用exit函数,由exit函数调用doexit函数,在doexit函数中完成对全局对象的析构。
  • 最后调用ExitProcess结束进程。

exit函数退出进程

exit是C/C++中的一个标准函数,用于让程序退出并返回状态码。它的原型如下:

void exit(int status);

status参数表示程序退出时返回的状态码,通常0表示正常退出,而其他非零值表示程序出现了错误。

调用exit函数后,程序会执行一些清理操作,如关闭已打开的文件、释放动态分配的内存等,然后退出并返回status参数指定的状态码。exit函数不仅会释放堆栈空间,还会关闭所有打开的文件和释放除常量区外的其他存储空间。

需要注意的是,终止进程的方式除了exit函数,还有其它方式,如abort函数、ExitProcess函数等。这些函数虽然能够立即终止进程,但都不会执行程序的清理操作,有可能会导致资源的泄漏等问题。因此,在使用这些函数来终止进程时,一定要确保程序不会因此遭受损失。

ExitProcess函数退出进程

exitprocess是Windows API中的一个函数,用于退出当前进程。该函数原型为:

void ExitProcess(UINT uExitCode);

uExitCode参数表示进程退出时返回的状态码,通常0表示正常退出,而其他非零值表示程序出现了错误。

调用ExitProcess函数后,程序会立即退出并释放所有资源,而不会像使用return语句一样执行程序中其它的清理操作。如果需要执行一些程序退出前的操作,可以在调用ExitProcess函数前手动执行。

需要注意的是,调用ExitProcess函数会直接结束当前进程,而不会结束它的子进程,因此子进程可能会成为孤儿进程,由操作系统接管

TerminateProcess函数退出进程

TerminateProcess是Windows API中的一个函数,用于强制终止当前进程或指定进程。该函数原型为:

BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode);

hProcess参数表示要终止的进程的句柄,可以是当前进程的句柄,也可以是对其他进程的句柄。

uExitCode参数表示进程退出时返回的状态码,通常0表示正常退出,而其他非零值表示程序出现了错误。

调用TerminateProcess函数后,无论进程当前处于何种状态,都会立即被强制终止,对于该进程的资源,如内存、文件等,也将被释放。因此,使用TerminateProcess函数可能会导致数据丢失或资源泄露,因此应该尽量避免使用它。

与ExitProcess函数不同,TerminateProcess函数可以终止由当前进程创建的所有子进程

需要注意的是,TerminateProcess函数会强制终止目标进程,而不管目标进程当时正在做什么。如果目标进程正在执行一些重要任务或者占用一些关键资源,它们可能会被迅速终止从而导致不可预知的后果。因此,在使用TerminateProcess函数时,应该谨慎考虑,尽量避免使用它,只有在必要时才使用。同时,也要确保操作系统和其它进程不会因终止当前进程而遭受不必要的损失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaobaiPlayGame

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值