调用lua_getglobal()会崩溃,除非后面跟着lua_pop()

Zac*_*Lee 1 lua

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

我试过放置它lua_pop(L, 1);lua_getglobal(L, "name");不再崩溃.

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

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

Hen*_*nke 7

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堆栈的大小,但这已经在其他地方得到了回答.