Где освободить память в 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 не будет знать о значении (если я правильно понял, я попытался, это не работает). Я действительно понятия не имею, как устранить эту проблему.

Ответы на вопрос(3)

Ваш ответ на вопрос