在C++中删除我所有的Lua userdata。
我在想是否有可能访问所有用户数据“表”(它是否被称为用户数据表?),然后从Lua中删除它们,因为这是我的问题:
a = Object(5, 5)
a:Delete()
a:SetPosition(3,3)
正如你所看到的,首先我创建了一个对象并保存了指向C ++类Object的指针,该指针是使用“new”在我的map类中分配的。然后我删除了这个对象,这意味着我删除了map类中指针的分配内存。最后,我调用SetPosition,如果内存仍然分配给c ++ Object类,则一切都将运行良好。但是,如果它被删除(因为在SetPosition(...)调用之前我们调用了Delete()),我的程序将崩溃。所以,我在想以下事情:
是否可能通过调用Delete将变量'a'在lua中设置为nil?我知道我可以做类似'a = a:Delete()'的事情,如果Delete返回nil,但是如果我忘记做'a ='部分,它将失败。还想知道是否可以删除userdata并在调用SetPosition()时检查其是否不存在,如果不存在则返回。
此外,基础代码来自:[http://lua-users.org/wiki/SimpleCppBinding](http:/ /lua-users.org /wiki/SimpleCppBinding)。
原文链接 https://stackoverflow.com/questions/9168394
首先,让我回答你的问题:
能否通过调用 Delete 将 Lua 中的变量 'a' 设为 nil?
不行。没有办法做到你所说的事情。原因是:你正在尝试编写糟糕的代码。
Lua 是一种使用 垃圾回收 的系统。不应该期望 Lua 能够 删除 对象。如果 Lua 获得了某个外部对象的指针,那么要么你的代码拥有它,要么 Lua 拥有它。
如果你的代码拥有它,Lua 不应该删除它。Lua 可以在一段时间内使用它。但是,你的 Lua 代码必须在确切的时期内使用它,且只使用一次。一旦其生命周期已过期,Lua 就不应再与它交互了。
这与在 C 和 C++ 中处理指向对象的指针并没有任何区别。如果你的函数获得了一个裸指针(即:不是智能指针),你的代码需要知道它可以合理地期望与该对象交互的时间有多长。它可以存储吗?它可以存储多长时间该对象的指针?该对象什么时候会结束它的生命,谁负责销毁它?
如果你将一个对象传递给 Lua 以使之属于 Lua,那么 Lua 也不应该显式地将其删除。Lua 是一种垃圾收集系统;你应该将一个 __gc
元方法附加到你的类型上,这样当用户数据被收集时,Lua 的垃圾收集器将调用你的代码。这样,你可以调用析构函数,释放内存等。
当你给 Lua 一些现在属于它的东西时,它应该 看起来 像一个常规的 Lua 对象。你不需要为在 Lua 中创建的表和字符串调用 Delete
方法;你让垃圾收集器进行其工作。作为编写 C++ 到 Lua 接口的人,你的工作是确保你提供给 Lua 的对象以 Lua 希望的方式进行操作。
在需要进行重要资源管理的情况下,当你需要 Lua 尽快释放资源(例如文件句柄等)时,你需要将指向 C++ 对象的指针存储在非轻量级用户数据中。这是你要将其置为 NULL 的指针。所有关于该对象的接口函数将检查指针是否为 NULL,并简单地什么也不做或者引发一个错误。
Lua 的文件句柄(由 io.open
返回)就是一个很好的例子。如果你尝试对它们调用函数,Lua 抛出一个 Lua 错误。
在 Delete
方法中,将接收到的对象的元表设置为 nil
,如果您稍后调用该对象的方法,则会收到错误消息。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我宁愿建议使用SWIG或[LuaBind](http://www.rasterbar.com/products/luabind.html)来代替,它们已经为您处理了这些陷阱。