我发现我的应用程序有时会在lua_getglobal(L, "name");多次调用时崩溃.
我试过放置它lua_pop(L, 1);后lua_getglobal(L, "name");不再崩溃.
可以lua_getglobal(L, "name");多次调用导致内存泄漏?
有没有人知道为什么我的应用程序没有崩溃lua_pop(L, 1);?
Lua有一个(实现定义的)有限的堆栈大小.如果你继续推入堆栈而没有弹出,堆栈将在某个时刻充满,并且尝试推送更多将使程序崩溃.
如果你检查文档,lua_getglobal你会发现"将全局的价值推到堆栈上".你负责删除它,要么调用一个隐式弹出它的函数(例如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);
}
Run Code Online (Sandbox Code Playgroud)
$ clang++ -Wall -Wextra -Wpedantic -I/usr/include/lua5.2/ test.cpp -llua5.2
$ ./a.out
0 Zack Lee
<...snip...>
41 Zack Lee
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
如果我取消注释该lua_pop行,它将按预期工作.
你也可以调整Lua堆栈的大小,但这已经在其他地方得到了回答.
| 归档时间: |
|
| 查看次数: |
372 次 |
| 最近记录: |