如何确保malloc/free fopen/fclose匹配?

lis*_*per 2 c fopen

我认为以下代码是正常的(并且malloc/free类似):

int foo(){

   FILE *fp = fopen("test.in", "r");

   int i;   

   for(i = 0; i < NUM; i ++){
       if(Match(fp, i)){    
            fclose(fp);
            return i;
       }
   }

   fclose(fp);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我们可以看到fclose(fp)在代码中出现两次.如果函数foo中有其他return语句,它会显得更多.但是,我必须写fclose(fp)很多次很麻烦.一种解决方案只是一个函数的一个返回.但是,多次返回有时是有用的.还有其他解决方案吗?

PS:据我所知,lisp中有一个宏(带有打开文件).

(with-open-file (stream-var open-argument*) 
    body-form*)
Run Code Online (Sandbox Code Playgroud)

它可以为我们打开和关闭文件.

dja*_*dja 7

使用break经常有助于:

int foo() {

   FILE *fp = fopen("test.in", "r");

   int i, result;   

   result = 0;
   for(i = 0; i < NUM; i ++){
       if(Match(fp, i)){    
            result = i;
            break;
       }
   }

   fclose(fp);
   return result;
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*eng 6

在linux内核的源代码中,有很多函数需要在返回时处理锁和其他资源.它们通常会在函数末尾添加一个清理标签,并goto在每次早期返回时添加.我个人推荐这种用法以避免重复代码,也许这是唯一合理的用法goto.