1
We have a problem in our project,we use lua 5.1 as our scripting language.

但是当在一个函数中使用 lua_pushnumber 从 C++ 向 lua 传递太多数据时,lua 堆栈看起来像堆栈溢出,导致 C++ 中的其他部分内存已写入,并且在回调返回 C++ 时导致我们的系统崩溃。我想知道是否有一些参数可以控制lua堆栈大小的大小。我尝试更改在 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;
} 

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

4

2 回答 2

3

也许这会有所帮助(来自 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 第 3 版中出现的内容。用于转储堆栈内容。

于 2013-04-04T01:50:52.370 回答
0

你应该在每次推入之前检查 Lua 堆栈。
堆栈大小默认为 20,如果需要更多空间,应手动放大。
Lua手册

于 2013-04-03T15:46:26.290 回答