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

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

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

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

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

lua
person Luhar    schedule 08.02.2011    source источник


Ответы (2)


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

person lhf    schedule 08.02.2011

void lua_pop (lua_State *L, int n);
/*Pops n elements from the stack.*/

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

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

Вы использовали malloc вместо использования lua_newuserdata?

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

person Łukasz Gruner    schedule 09.02.2011
comment
Я предположил, что код, с которым у вас возникли проблемы, вызывается из Lua - если он просто вызывает сценарии Lua, lua_pop должно быть достаточно. - person Łukasz Gruner; 09.02.2011