We have a problem in our project,we use lua 5.1 as our scripting language.
但是当使用lua_pushnumber将过多的数据从C ++传递给lua时 函数,lua堆栈似乎像stackoverflow并导致momery的其他部分 已经编写了C ++,它会在回调返回时导致系统崩溃 到C ++。我想知道是否有一些参数来控制大小 lua stack size.I尝试更改lua.h中定义的参数LUA_MINSTACK, 但它似乎不起作用。我也尝试使用lua_checkstack()来避免推送 lua堆栈的数量太多但它也不起作用
getNineScreenEntity(lua_State* L)
{
DWORD screenid = GET_LUA_VALUE(DWORD,1)
struct EntryCallback : public ScreenEntityCallBack
{
EntryCallback(){ }
bool exec(ScreenEntity * entity)
{
list.push_back(entity)
return true;
}
std::vector<ScreenEntity*> list;
};
EntryCallback exec;
Screen* screen = ScreenManager::getScreenByID(screenid);
if (!screen)
return 0;
screen->execAllOfScreenEntity(exec);
int size = 0;
std::vector<ScreenEntity*>::iterator vit = exec.list.begin();
for (; vit != exec.list.end(); ++vit)
{
lua_pushnumber(L,(*vit)->id);
++size;
}
return size;
}
似乎当一个屏幕中有太多实体时,我们的程序会崩溃。
答案 0 :(得分:2)
也许这会有所帮助(来自Lua 5.2手册)
int lua_checkstack (lua_State *L, int extra);
“确保堆栈中至少有'额外'的空闲堆栈槽。如果它无法满足请求,则返回false,因为它会导致堆栈大于固定的最大大小(通常至少为几个)这个函数永远不会缩小堆栈;如果堆栈已经大于新的大小,它将保持不变。“
这是一个示例c函数...
static int l_test1 (lua_State *L) {
int i;
printf("test1: on the way in"); stackDump(L);
int cnt = lua_tointeger(L, 1);
printf("push %d items onto stack\n", cnt);
printf("try to grow stack: %d\n", lua_checkstack(L, cnt));
for (i=0; i<cnt; i++) {
lua_pushinteger(L, i); /* loop -- push integer */
}
printf("test1: on the way out"); stackDump(L);
return 1;
}
此代码:
$ lua demo.lua
running stack test with 10 pushes
test1: on the way in
---1--
[1] 10
-----
push 10 items onto stack
test1: on the way out
---11--
[11] 9
[10] 8
[9] 7
[8] 6
[7] 5
[6] 4
[5] 3
[4] 2
[3] 1
[2] 0
[1] 10
-----
running stack test with 1000 pushes
test1: on the way in
---1--
[1] 1000
-----
push 1000 items onto stack
try to grow stack: 1
test1: on the way out
---1001--
[1001] 999
[1000] 998
[999] 997
[998] 996
[997] 995
[996] 994
...
当上面的代码没有lua_checkstack()调用时,我们在尝试将1000个项目推入堆栈时出错。
running stack test with 1000 pushes
test1: on the way in
---1--
[1] 1000
-----
push 1000 items onto stack
Segmentation fault (core dumped)
$
(1)stackDump()类似于PiL 3rd ed中出现的内容。用于转储堆栈内容。
答案 1 :(得分:0)
每次推入之前都应该检查Lua堆栈 堆栈大小默认为20,如果需要更多空间,应手动放大 Lua manual