使用lua_pushnumber时,我可以调整堆栈的最大大小吗?

时间:2013-04-03 04:07:28

标签: lua stack-overflow

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;
} 

似乎当一个屏幕中有太多实体时,我们的程序会崩溃。

2 个答案:

答案 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;
}

此代码:

  • 在进入函数的途中转储堆栈。 (1)
  • 尝试扩展堆栈大小以使'cnt'空闲插槽(它返回true,它工作,或者是false,它没有)。
  • 在堆栈中推送'cnt'个整数
  • 在出路时转储堆栈。

$ 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