将引用计数的 C++ 对象传递给 Lua 的最佳实践是什么?

如何解决将引用计数的 C++ 对象传递给 Lua 的最佳实践是什么?

我想让我的引用计数 C++ 对象也在 Lua 回调中管理:当它被一个 Lua 变量持有时,增加它的引用计数;当 Lua 变量被销毁时,释放一个 refcount。 __gc方法似乎可以自动执行释放端,但如何实现增加端?

每次在将对象添加到 Lua 堆栈之前增加 refcount 是否合适?

或者我应该新建一个智能指针对象,在 Lua C 函数中到处使用它,然后在 __gc方法删除它?这看起来很丑,好像 Lua 执行出了问题,__gc 没有被调用new ed 智能指针对象将被泄漏,并且它所引用的引用计数对象将泄漏一个计数。

在我更熟悉的 Perl 中,这可以通过增加 XS MapOUTPUT 部分的 refcount 和减少 destroyer 的 refcount 来实现.

解决方法

我假设您已经在 C 中实现了两个 Lua 函数:inc_ref_count(obj)dec_ref_count(obj)

local MT = {__gc = dec_ref_count}
local setmetatable = setmetatable
local T = setmetatable({},{__mode="k"})

function register_object(obj)
   if not T[obj] then
      T[obj] = setmetatable({},MT)
      inc_ref_count(obj)
   end
end

每次向 Lua 发送引用计数的 C 对象时,在 C 端调用 register_object(object)

如果 Lua VM 崩溃或关闭,您可能会泄漏内存。

,

仔细研究了Lua手册,发现轻用户数据不支持元表(见document)。它应该通过 Lua 机器分配一块内存的大量用户数据 (lua_newuserdatauv) 来实现。我可以使用这个内存块放置一个新的智能指针对象,并在它上面绑定一个 __gc

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?