Очистка стека Lua (C API) - PullRequest
       21

Очистка стека Lua (C API)

2 голосов
/ 08 февраля 2011

Обычно я оставляю в беспорядочном Lua до 6 оставшихся записей после запуска определенной мной функции.

В некоторых случаях это приводило к серьезным утечкам памяти / переполнению стека! Я решил их, используя lua_settop (L, 0) в конце своей функции.

В других случаях не было утечек, хотя стек не был пустым в конце моей функции.

  • Когда мне нужно очистить стек Lua?
  • Как могло случиться, что в стеке было около 10.000 элементов в одной точке? (В функции вообще не было циклов)

Ответы [ 2 ]

3 голосов
/ 08 февраля 2011

Вам не нужно очищать стек Lua при выходе из функции Lua, написанной на C, если, конечно, эта функция вызывается из Lua. Если вы испытываете утечки памяти, пожалуйста, опубликуйте минимальный пример, который показывает проблему. Если в стеке 10000 записей, убедитесь, что вы вызвали lua_checkstack или luaL_checkstack .

0 голосов
/ 09 февраля 2011
void lua_pop (lua_State *L, int n);
/*Pops n elements from the stack.*/

Что касается того, почему - не могу действительно сказать - есть много возможных причин, не могли бы вы опубликовать несколько примеров кода, который вызвал это?Ниже приведены несколько распространенных (imho) причин.

Lua не должен вызывать утечек памяти, если только вы не использовали легкие пользовательские данные (единственные, которые не управляются сборщиком мусора).

Делали ли вы что-нибудь malloc вместо lua_newuserdata?

Проверяли ли вы размер стека в начале функции?Может быть, вы только что передали столько параметров из Lua (например, вызвав c_func (unpack (огромный_таблицу));)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...