我包含了我的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();
}
}
答案 0 :(得分:0)
是的,这会泄漏文件句柄,你必须在yypop_buffer_state()之前调用fclose,有一个example in the tests和code around可以提供相关信息。
{
if (yyin && yyin != stdin) {
fclose(yyin);
}
yypop_buffer_state();
if ( !YY_CURRENT_BUFFER ) {
yyterminate();
}
}