C++ 您能安全地弹出luacfunction中的函数参数吗?

C++ 您能安全地弹出luacfunction中的函数参数吗?,c++,parameters,lua,stack,C++,Parameters,Lua,Stack,我正在一个非常大的框架上工作,它公开了从C/C++到Lua的许多算法、函数和特性。该框架还公开了一些与表、索引器一起使用的功能,如果某个条件不正确,通常只是默认行为的代理 我的问题很基本,;从C函数(即C中的newindex实现)中弹出函数参数是否安全?目前,我通过获取一个对象来实现它,该对象应该保存键和值,并将其插入到提供给\uu newindex元方法的键和值之前。然后我使用lua\u rawset将其设置为我放在前面的对象,弹出两个函数参数。这安全吗 我运行了大量的测试,包括checkst

我正在一个非常大的框架上工作,它公开了从C/C++到Lua的许多算法、函数和特性。该框架还公开了一些与表、索引器一起使用的功能,如果某个条件不正确,通常只是默认行为的代理

我的问题很基本,;从C函数(即C中的newindex实现)中弹出函数参数是否安全?目前,我通过获取一个对象来实现它,该对象应该保存键和值,并将其插入到提供给
\uu newindex
元方法的键和值之前。然后我使用
lua\u rawset
将其设置为我放在前面的对象,弹出两个函数参数。这安全吗

我运行了大量的测试,包括checkstack测试,并监视Lua堆栈的顶部。但是,这些测试对我来说都不够决定性,我想听听其他Lua开发人员的意见

我已经阅读了Lua文档的许多部分,但是似乎没有关于这一点的明确声明(或者我没有找到它)。手册()没有说明:

Lua将正确地丢弃堆栈中结果下方的任何其他值

然而,这并不能回答我的问题,如果丢弃这些值会导致问题

//举个例子,这样做安全吗?我的勇气说是的
int lm_实体__新索引(lua_状态*L){
luaL_checkany(L,1);//udata
luaL_checkany(L,2);//键
luaL_checkany(L,3);//值
//不操纵堆栈,只抛出lua_-tuserdata
自动实体=lm_实体(L,1);
//获取成员表
lua_rawgeti(L,lua_注册表索引,实体->成员\u参考);
//放置在关键点和值之前(lua_旋转)
lua_插入物(L,-3);
//存储,依次弹出两个函数参数
卢厄-罗集(L,-3);
//pop成员表
卢厄波普(L,1);
返回0;
}

我希望这能安全地工作,因为在函数调用中,堆栈会根据传递给函数的参数数量和推送到堆栈上的返回值数量进行恢复。不过,我不确定从堆栈中弹出两个参数是否会导致这方面的问题,尽管我的测试似乎证明了这一点。

我不是Lua所有内部结构的专家,但我不明白为什么弹出参数会导致问题。据我所知,Lua C函数几乎可以对其堆栈部分执行任何它喜欢的操作。我同意,这也是我的想法,但是弹出太多的值可能会导致问题-尽管这里不是这样。我只是不喜欢对这些事情做出假设,尽管我在做这些事情时还没有遇到任何问题。我不是Lua所有内部问题的专家,但我不明白为什么突然的争论会导致问题。据我所知,Lua C函数几乎可以对其堆栈部分执行任何它喜欢的操作。我同意,这也是我的想法,但是弹出太多的值可能会导致问题-尽管这里不是这样。我只是不喜欢对这些事情做出假设,尽管我在做这些事情时还没有遇到任何问题。