Я использую lua C-API для чтения в данных конфигурации, который хранится в lua файле.
У меня есть миленькая таблица в файле, и я записал C-функцию запроса, которая анализирует определенное поле в таблице. (yay это работает!)
Это работает путем вызова нескольких из этих видов функций много раз:
...
lua_getglobal (...);
lua_pushinteger (...);
lua_gettable (...);
lua_pushstring (...);
lua_gettable (...);
lua_lua_getfield (...);
...
Вы получаете идею.
После того, как я буду сделан, запрашивая мои данные как это, я должен очистить стек?
Пока ваш стек не растет неограниченно, все будет в порядке. Когда вы возвращаете целочисленные N из C API в Lua, происходят две вещи:
Движок Lua берет верхние N значения из стека и рассматривает их как результат вызова.
Движок Lua деаллоцирует (и повторно использует) все остальное в стеке.
Дэвид Сейлер упоминает возможность того, что ваш C-код может быть вызван из другого C-кода, а не из движка Lua. Это продвинутая техника, и если вы задаете этот вопрос, то вряд ли вам придется беспокоиться об этом конкретном вопросе. (Но с точки зрения Lua это происходит одинаково - когда весь код C завершает выполнение, он должен вернуть целое число, и Lua снимает столько значений со стека, а затем деаллоцирует оставшееся.)
Если вы используете слишком много слотов стека, ваша программа остановится с вменяемым и разумным сообщением об ошибке (как я знаю по опыту).
Это зависит от того.
Если ваша C-функция вызывается из Lua, то значения, которые вы оставляете позади, будут значениями, которые ваша C-функция возвращает в Lua. Если ваша C-функция вызывается другой C-функцией, которая использует стек Lua, то эти значения все еще будут в стеке, и вы можете делать с ними что угодно или ничего.
Но если после вызова вашей C-функции вы полностью закончили работу с Lua, а из вашего вопроса следует, что так оно и есть, то вам не нужно очищать стек Lua. Просто закройте контекст Lua, и он очистит ваш стек за вас.
дополнительно, вместо использования pushstring или pushinteger, за которыми следует таблица, используйте lua_getfield
и lua_rawgeti
соответственно (сырые данные не будут вызывать метаметоды, если вы этого захотите ...)