none
如何在return的时候释放特定资源? RRS feed

  • 问题

  • 在一个函数中可能有很多退出的地方,有没有什么技巧,可以在return的时候,释放之前定义的某些句柄一类的数据,可以是return xxxxxx;而不用goto或者每个return语句之前都做释放。
    2010年8月10日 5:44

答案

  •  
     
    • 已标记为答案 zxloong 2010年8月10日 10:51
    • 已编辑 ID已删 2010年8月16日 5:21
    2010年8月10日 6:30
  • 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
    2010年8月10日 15:20

全部回复

  • 比如说用宏等等,有什么好的办法,我记得见过一个笔试题就是类似这样的问题。
    2010年8月10日 5:53
  •  
     
    • 已标记为答案 zxloong 2010年8月10日 10:51
    • 已编辑 ID已删 2010年8月16日 5:21
    2010年8月10日 6:30
  • 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的内容,就是不知道有没有别的方法。
    2010年8月10日 9:29
  • 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
    2010年8月10日 15:20