Когда освободить память? - PullRequest
       5

Когда освободить память?

1 голос
/ 21 сентября 2010

Я работаю над комбинацией лексера / парсера с Bison и Flex и немного беспокоюсь об утечках памяти.

Грамматика довольно проста, и (до сих пор) мне удалось уйти со следующим определением:

#define YYSTYPE char const *

В Flex, когда я читаю строку, я выделяю достаточно памяти для этой строки, а затем копирую ее в yylval. Насколько я знаю, это вполне стандартная практика.

Однако я нигде не могу найти никаких документов, которые говорят мне, когда мне следует освободить память в yylval.

Бизон обрабатывает это автоматически для меня? Должен ли я сделать это в конце моего действия? Или когда еще я должен это делать?

1 Ответ

4 голосов
/ 21 сентября 2010

Каждый раз, когда оценивается правая сторона, элементы RHS в стеке (например, $1, $2 и т. Д.) Должны быть освобождены или скопированы в $$.

После выполнения действия сокращения указатель стека уменьшается на количество символов в RHS и $$ становится самым верхним элементом, поэтому все, что осталось в стеке, будет потеряно или засорено последующими переносами в стек.

Кроме того, вам может быть лучше использовать структуру для типа стека, которая содержит текстовую строку токена и его целочисленное значение токена.

...