调用 lua_getglobal() 会崩溃,除非紧随其后调用 lua_pop()

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

我尝试在 lua_getglobal(L, "name"); 之后放置 lua_pop(L, 1);,这样就不会崩溃了。

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

有没有人知道为什么我的应用程序在没有调用 lua_pop(L, 1); 的情况下会崩溃?

点赞
用户1944004
用户1944004

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);
}
$ 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_pop那行,它就像预期的那样工作。

你也可以调整Lua堆栈的大小,但是这已经在其他地方得到了回答。

2018-07-08 06:10:59