除非随后调用lua_pop(),否则调用lua_getglobal()会崩溃

时间:2018-07-08 03:38:59

标签: lua

我刚刚发现,多次调用lua_getglobal(L, "name");时,我的应用有时会崩溃。

我尝试将lua_pop(L, 1);放在lua_getglobal(L, "name");之后,它不再崩溃。

多次调用lua_getglobal(L, "name");会导致内存泄漏吗?

有人知道为什么没有lua_pop(L, 1);我的应用会崩溃吗?

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已经回答了这个问题。