我刚刚发现,多次调用lua_getglobal(L, "name");
时,我的应用有时会崩溃。
我尝试将lua_pop(L, 1);
放在lua_getglobal(L, "name");
之后,它不再崩溃。
多次调用lua_getglobal(L, "name");
会导致内存泄漏吗?
有人知道为什么没有lua_pop(L, 1);
我的应用会崩溃吗?
答案 0 :(得分:6)
Lua具有(implementation-defined)个受限stack size。如果您一直推入堆栈而从未弹出,则堆栈在某个时刻将已满,而尝试再推入堆栈将使程序崩溃。
如果您查看lua_getglobal
的文档,则会发现“将堆栈的值推入堆栈”。您有责任删除它,方法是调用一个隐式弹出它的函数(例如UILabel
),也可以用lua_pcall
显式弹出它。
lua_pop
#include <iostream>
#include <lua.hpp>
int main() {
lua_State *L = luaL_newstate();
luaL_openlibs(L);
if (luaL_dostring(L, "name = 'Zack Lee'") != 0) {
std::cerr << "lua:" << lua_tostring(L, -1) << '\n';
lua_close(L);
return 1;
}
for (int i = 0; i < 200; ++i) {
lua_getglobal(L, "name");
std::cout << i << ' ' << lua_tostring(L, -1) << '\n';
//lua_pop(L, 1);
}
lua_close(L);
}
如果我取消对$ clang++ -Wall -Wextra -Wpedantic -I/usr/include/lua5.2/ test.cpp -llua5.2
$ ./a.out
0 Zack Lee
<...snip...>
41 Zack Lee
Segmentation fault
行的注释,它将按预期工作。
您还可以调整Lua堆栈的大小,但是elsewhere已经回答了这个问题。