LINUX.ORG.RU

Yacc, lex, strdup


0

0

В разных статьях по yacc + lex встречается такая запись в правилах лекса:

yylval=strdup(yytext);
Потом этот самый yylval используется в yacc в виде $n, но память, выделенная strdup, нигде не освобождается. То ли авторы просто не хотят заморачиваться в простой статье, то ли yacc сам как-то хитро это делает (слабо представляю, как). Ничего не понимаю.
Примеры:
https://www.ibm.com/developerworks/ru/edu/au-lexyacc/section5.html
http://ds9a.nl/lex-yacc/cvs/lex-yacc-howto.html

★★★★

Последнее исправление: Gvidon (всего исправлений: 1)

по второй ссылке же написано: If you look carefully, you can see that yylval has changed! We no longer expect it to be an integer, but in fact assume that it is a char *. In the interest of keeping things simple, we invoke strdup and waste a lot of memory. Please note that this may not be a problem in many areas where you only need to parse a file once, and then exit.

SilentBob
()
Ответ на: комментарий от SilentBob

Невнимательно прочитал, ага. Собственно, я руками в yacc вызываю free и не парюсь по этому поводу, просто интересно стало, почему не освобождают.

Gvidon ★★★★
() автор топика
Ответ на: комментарий от Gvidon

Только аккуратней надо. yylval может не поменяться, тогда будет double free. Я вообще чтоб совсем не заморачиваться соорудил простенький GC под это дело.

Reset ★★★★★
()
Ответ на: комментарий от Reset

Для таких дел какого-нибудь пула наверное будет достаточно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.