luabind 什么时候释放已创建的对象?

我在使用 luabind 时遇到了问题。我定义了一个 std::map 以分配在 lua 中创建的对象。我将该地图作为全局对象发布到 lua 中,如下所示:

luabind::globals(L)["g_SceneManager2D"] = this;

之后,该对象被用于一个 lua 函数中,该函数创建并将许多对象插入到该地图中。问题出现在 lua 函数结束并且 luabind 返回控制权给 C++ 程序的时候,因为自动丢失了地图的所有内容。

我一直在寻找错误。我保持了 lua 上下文的存在,因此该对象必须存在。

你能帮我吗?

非常感谢 :)

原文链接 https://stackoverflow.com/questions/4702906

点赞
stackoverflow用户4323
stackoverflow用户4323

我建议使用 shared_ptr<>(this) 而不是原始的 thisboost::shared_from_this 可能会有所帮助。确保你的类也使用 Luabind 注册,并且指定 class_shared_ptr 持有。

另一个有趣的想法可能是将你的 Lua 函数仅作为一个 Lua 表来生成 "map",将其返回,然后在 C++ 中迭代该表以构建你的 std::map

2011-01-16 15:10:22
stackoverflow用户263356
stackoverflow用户263356

如果我正确理解您的问题,似乎是您在 Lua 中创建了对象,然后将其插入到地图中(无论是通过 Lua 还是 C++),随后便失去了它们。没有更多的代码,很难确定问题所在。然而,我会首先确认这些对象确实被创建了(再次核对)。接下来我会检查 Lua 是否对它们进行了垃圾回收。如果确实是 Lua 进行了垃圾回收,那么您将看不到它们在 C++ 端的存在,因为它们已经消失了。

如果有帮助的话,我正在完成一个类似的项目。我必须从 Lua 中创建和获取 C++ 对象,但是我并没有在 Lua 中创建这些对象,而是通过调用 C++ 函数来完成创建,并在 Lua 调用中发送任何必要的数据 (受 Luabind 约束)。这些 C++ 函数通过 ID 将对象索引到哈希表中,并将 ID 返回给 Lua,在需要在脚本侧检索对象进行操作时使用。这个设置使正确处理内存问题更加容易(和安全),并防止 Lua 对您的对象进行垃圾回收。

2011-01-17 11:28:05