Где освободить память в Bison / Flex?
Я использую 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 файла. Я копирую значение yytext в yylval.str. Затем я создаю новую пару с этим содержимым (собственно ключ / значение), а затем возвращаю дату токена для бизона. Мой парсер .y не более чем yyparse; и когда что-то ловится, оно просто печатает это.
Я попытался запустить valgrind на этом, и у меня есть несколько ошибок, касающихся strdup. Я знаю, что эта функция использует malloc, но я понятия не имею, ГДЕ и КОГДА использовать БЕСПЛАТНО.
Я, наверное, думаю, что это в .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 все еще говорит мне, что есть проблема с malloc, содержащимся в функции strdup. Но я не могу написать free (yylval.str) внутри файла flex, иначе bison не будет знать о значении (если я правильно понял, я попытался, это не работает). Я действительно понятия не имею, как устранить эту проблему.