gpt4 book ai didi

c++ - 如何在给定函数之外获取与 C 闭包关联的(向上)值?

转载 作者:搜寻专家 更新时间:2023-10-31 01:15:13 25 4
gpt4 key购买 nike

在Lua 5.2手册中我们可以找到the following text :

When a C function is created, it is possible to associate some values with it, thus creating a C closure (see lua_pushcclosure); these values are called upvalues and are accessible to the function whenever it is called.

Whenever a C function is called, its upvalues are located at specific pseudo-indices. These pseudo-indices are produced by the macro lua_upvalueindex. The first value associated with a function is at position lua_upvalueindex(1), and so on. Any access to lua_upvalueindex(n), where n is greater than the number of upvalues of the current function (but not greater than 256), produces an acceptable (but invalid) index.

因此,我创建了一个与使用“new”创建的对象指针关联的回调函数。

lua_pushstring(L,"myCallbackFunc");
Foo* ideleg = new Foo()
lua_pushlightuserdata (L, (Foo*)ideleg);
lua_pushcclosure(L, LuaCall<Tr,C,Args...>::LuaCallback,1);
lua_settable(L,-3);

所有的机制都运行良好……但现在是清理的时候了,我无法取回指针,所以当我注销回调函数或退出我的程序时,我无法删除它。

我确实使用以下代码片段找到了表格条目:

lua_pushnil(L);
while (lua_next(L, -2) != 0)
{
if (lua_isstring(L, -2) && lua_tostring(L,-2) == "myCallBackFunc" )
{
// get the pointer back and delete it!
}
}

(我可以使用 lua_getfield(L, -1, "myCallBackFunc"); 来完成吗?)

但我无法获得与 LuaCall<Tr,C,Args...>::LuaCallback() 之外的闭包关联的升值函数(实际上在这个关闭函数中我可以简单地使用 lua_upvalueindex(1) 但在这种情况下我在关闭函数之外...)

有没有办法获取这个值,以便在我不再需要它时删除指针?


编辑:我确实找到了 lua_getupvalue应该做我需要的功能,但目前我不知道如何获取闭包堆栈索引。所以它仍然不起作用。

最佳答案

是的,你可以在 Lua 中做到这一点。但我强烈反对它。

如果您有权访问该回调,如果它在 Lua 堆栈上,则完全有可能某些 Lua 代码也可以访问它。这意味着即使您认为它会被销毁,但实际上它不会被销毁,直到 Lua 完成它。销毁闭包会使它进入非功能状态。然而,因为 Lua 可能仍然可以访问它,所以在您销毁它的上值之后调用闭包是可能的。

坏事接踵而至。

最好将指针放入完整的用户数据中,并使用 __gc 元方法将元表附加到它以进行清理。这样,您就可以确定当它真正不再使用时会被清理干净。

但是,如果您坚持按照自己的方式进行,您始终可以使用 lua_getupvalue .

关于c++ - 如何在给定函数之外获取与 C 闭包关联的(向上)值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10377950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com