积极答复者
如何在return的时候释放特定资源?

问题
答案
-
atexit(设置程序正常结束前调用的函数) 头文件 #include<stdlib.h> 定义函数 int atexit (void (*function)(void)); 返回值 如果执行成功则返回 0,否则返回-1,失败原因存于 errno 中。 atexit()用来设置一个程序正常结束前调用的函数。当程序通过调用 exit()或从 main 中返回时,参数 function 所指定的函数会先被 调用,然后才真正由 exit()结束程序。 很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit() 结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就 是用atexit()函数来注册程序正常终止时要被调用的函数。 atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。atexit()的函数原型是:int atexit (void (*)(void)); 在一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。 #include <stdlib.h> #include <stdio.h> void my_exit(void) { printf( "Before exit....\n" ); } int main(void) { atexit( my_exit ); return 0; } [root@localhost error_process]# gcc atexit.c [root@localhost error_process]# ./a.out Before exit....
清钟沁桐- 已标记为答案 zxloong 2010年8月10日 17:21
全部回复
-
BOOL GetHash(BYTE* Hash){HCRYPTPROV hProv=0;HCRYPTHASH hHash=0;HANDLE hFile=INVALID_HANDLE_VALUE;__try {if (!CryptAcquireContext(&hProv))return 0;if (!CryptCreateHash(&hHash))return 0;hFile=CreateFile();if (hFile == INVALID_HANDLE_VALUE)return 0;if (!ReadFile())return 0;if (!CryptHashData())return 0;if (!CryptGetHashParam(Hash))return 0;return TRUE;} __finally {if(hFile != INVALID_HANDLE_VALUE)CloseHandle(hFile);if(hHash)CryptDestroyHash(hHash);if(hProv)CryptReleaseContext(hProv, 0);}}
这个不错,在return之前会先执行__finally的内容,就是不知道有没有别的方法。 -
atexit(设置程序正常结束前调用的函数) 头文件 #include<stdlib.h> 定义函数 int atexit (void (*function)(void)); 返回值 如果执行成功则返回 0,否则返回-1,失败原因存于 errno 中。 atexit()用来设置一个程序正常结束前调用的函数。当程序通过调用 exit()或从 main 中返回时,参数 function 所指定的函数会先被 调用,然后才真正由 exit()结束程序。 很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit() 结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就 是用atexit()函数来注册程序正常终止时要被调用的函数。 atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。atexit()的函数原型是:int atexit (void (*)(void)); 在一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。 #include <stdlib.h> #include <stdio.h> void my_exit(void) { printf( "Before exit....\n" ); } int main(void) { atexit( my_exit ); return 0; } [root@localhost error_process]# gcc atexit.c [root@localhost error_process]# ./a.out Before exit....
清钟沁桐- 已标记为答案 zxloong 2010年8月10日 17:21