这个例子是lex代码泄漏文件句柄吗?

时间:2014-12-16 19:26:29

标签: flex-lexer lex

我包含了我的lex语法范围内的文件,并查看了从the flex manual获取的示例代码,我想知道正在使用的文件句柄是否未被释放。

我钻取了从yypop_buffer_state()开始生成的代码并得出结论,文件句柄没有被关闭/释放。

有人可以证实吗?示例代码是错误的吗?

 /* the "incl" state is used for picking up the name
  * of an include file
  */
 %x incl
 %%
 include             BEGIN(incl);

 [a-z]+              ECHO;
 [^a-z\n]*\n?        ECHO;

 <incl>[ \t]*      /* eat the whitespace */
 <incl>[^ \t\n]+   { /* got the include file name */
                     yyin = fopen( yytext, "r" );

                     if ( ! yyin )
                         error( ... );

                     yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));

                     BEGIN(INITIAL);
                   }
<<EOF>>            {
                     yypop_buffer_state();
                     if ( !YY_CURRENT_BUFFER ) {
                         yyterminate();
                     }
                   }

1 个答案:

答案 0 :(得分:0)

是的,这会泄漏文件句柄,你必须在yypop_buffer_state()之前调用fclose,有一个example in the testscode around可以提供相关信息。

{
    if (yyin && yyin != stdin) {
        fclose(yyin);
    }
    yypop_buffer_state();
    if ( !YY_CURRENT_BUFFER ) {
        yyterminate();
    }
}