我能否在使用lua_pushnumber时调整堆栈的最大大小?
2019-12-24 18:32:2
收藏:0
阅读:158
评论:2
我们的项目有一个问题,我们使用 Lua 5.1 作为脚本语言。但是当使用 lua_pushnumber 在一个函数中从 C++ 向 Lua 传递过多的数据时,Lua 栈似乎会像栈溢出一样,并且导致 C++ 中的其他部分已被写入的内存,当回调返回到 C++ 时会导致系统崩溃。我想知道是否有某些参数来控制 Lua 栈大小。我尝试更改在 lua.h 中定义的 LUA_MINSTACK 参数,但似乎不起作用。我还尝试使用 lua_checkstack() 避免向 Lua 栈推送过多的数字,但也没有作用。
当一个屏幕中有太多实体时,似乎我们的程序会崩溃。
点赞
用户2242940
这可能会有帮助(来自 Lua 5.2 手册)
int lua_checkstack(lua_State *L,int extra);
"确保栈中至少有 '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. 中出现的转储堆栈内容类似。
2013-04-04 01:50:52
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
在向 Lua 栈中推送内容之前,每次都应该检查一下 Lua 栈。
默认情况下,栈大小是 20,如果需要更多的空间,则应该手动扩大。
Lua 手册