一个进程终止的四种方式:
- 基线程(primary thread)的入口函数自动返回.例如通常的main函数返回。
-
在基线程的入口函数退出时必须确保:
- 所有的该线程创建的C++对象都调用了对应的析构函数。
- 操作系统已经释放了所有申请的线程堆栈。
- 系统在入口函数的返回值中甚至了退出代码值(exit code)
- 系统将减少进程内核对象(process kernel object)的引用值(usage count)
- 在进程的一个线程中调用ExitProcess函数。
-
如果进程正常地从基线程(primary thread)的入口函数退出,则会自动清理和释放
资源。但是如果直接调用ExitProcess函数则就是直接地粗暴地退出进程。
#include <windows.h> #include <stdio.h> class CSomeObj { public: CSomeObj() { printf("Constructor\r\n"); } ~CSomeObj() { printf("Destructor\r\n"); } }; CSomeObj g_GlobalObj; void main () { CSomeObj LocalObj; ExitProcess(0); // This shouldn't be here // At the end of this function, the compiler automatically added // the code necessary to call LocalObj's destructor. // ExitProcess prevents it from executing. } /* 调用ExitProcess的输出结果: Constructor Constructor 不调用ExitProcess的输出结果: Constructor Constructor Destructor Destructor */
- 在其他进程的线程中调用TerminateProcess函数。
BOOL TerminateProcess(HANDLE hProcess,UINT fuExitCode);
TerminateProcess函数和ExitProcess函数的一个主要的不同点就是:TerminateProcess
函数可以通过进程对应hProcess的句柄参数来终止任意进程,而ExitProcess函数只能终止调用该函数的进程。
保证进程就能马上退出。TerminateProcess函数函数是异步的,调用该函数只是通知系统该进程要退出,但并不能
- 该进程中的所有线程都死掉了。
一个进程退出时,将会执行以下操作:
- 进程中的所有线程都将终止。
- 所有的用户对象和GDI都会被释放。都有的内核对象(Kernel Objects)都会被释放。
- 函数的 exit code 从 STILL_ACTIVE 变成ExitProcess或TerminateProcess函数的返回值
- 进程内核对象(process kernel object)的状态变成已触发状态。
- 进程内核对象(process kernel object)的引用值减一。
PS:
当一个进程退出,就不存在“资源泄漏”得说法。因为进程退出时系统会清理所有的数据。但是当一个资源不需要就应该用代码将其释放,不然就有点“占着茅坑不拉屎”……