私は Bison & Flex を 1 か月ほど使用しています。
Flex Bison でメモリを解放する際に問題があります。私のコードは次のようになります。
parser.l
{DATE} { yylval.str= strdup(yytext);
pair<string,string> newpair = make_pair("DATE",yytext);
myvector.push_back(newpair);
return TOKEN_DATE ;}
これは、私の .l ファイルの例の 1 つです。yytext の値を yylval.str にコピーします。次に、そのコンテンツ (実際にはキー/値) を使用して新しいペアを作成し、bison のトークン日付を返します。私のパーサー .y は yyparse 以下です。何かがキャッチされると、それを印刷するだけです。
これで valgrind を実行しようとしましたが、strdup に関して複数のエラーが発生しました。この関数が malloc を使用することは知っていますが、FREE を使用する場所と時期がわかりません。
おそらく.yファイルにあると思いますが、どこですか?
test:
TOKEN_DATE { cout << $1 << endl; // here ? and what to free ?}
私はこれのすべてを本当に理解していません。単純で明確な説明をいただければ幸いです。
前もって感謝します、
編集:
次のようないくつかのことを試しました:
test:
TOKEN_DATE TOKEN_TOTO TOKEN_BLABLA { cout << $1 << endl; free($1); free($2);}
| TOKEN_DATE test { cout << $1 << endl, free($1); }
正常にコンパイルおよび実行されているように見えますが、valgrind は strdup 関数に含まれる malloc に問題があると私に言います。しかし、flex ファイル内に free(yylval.str) を書くことはできません。この漏れの問題を解決する方法が本当にわかりません。