0

我在使用 luabind 时遇到问题。我定义了一个 std::map 来分配在 lua 中创建的对象。我以这种方式将此地图作为全局对象发布在 lua 中:

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

之后,这个对象被用在lua中的一个函数中,其中许多对象被创建并插入到这个映射中。当 lua 函数结束并且 luabind 将控制权返回给 C++ 端程序时,问题就出现了,因为映射的所有内容都会自动丢失。

我正在寻找错误。我让 lua 上下文保持活动状态,所以这个对象必须存在。

你可以帮帮我吗??

非常感谢 :)

4

2 回答 2

1

如果我正确理解您的问题,您似乎是在 Lua 中创建对象,然后将其插入地图(通过 Lua 或 C++)并随后丢失。如果没有更多的代码,就很难准确地说出问题所在。但是,我首先要确保确实创建了这些对象(仔细检查),然后我会检查 Lua 是否没有对它们进行垃圾收集。如果 Lua 确实在垃圾收集这些对象,那么您将不会在 C++ 端看到它们,因为它们已经消失了。

如果有帮助,我正在完成一个类似的项目。我必须从 Lua 创建和检索 C++ 对象,但我没有在 Lua 中创建对象,而是调用 C++ 函数来为我完成,在 Lua 调用中发送任何必要的数据(由 Luabind 绑定)。这些 (C++) 函数通过 ID 将对象索引到哈希表中,并将 ID 返回给 Lua,以防它需要检索对象脚本端进行操作。这种设置使正确处理内存内容变得更容易(也更安全),并防止 Lua 垃圾收集你的对象。

于 2011-01-17T11:28:05.853 回答
1

我建议使用 ashared_ptr<>(this)而不是 raw thisboost::shared_from_this可能有帮助。确保您的课程也使用 Luabind 注册,并且class_指定为由shared_ptr.

另一个有趣的想法可能是让你的 Lua 函数只生成“映射”作为 Lua 表,返回它,然后你可以在 C++ 中迭代它来构建你的std::map.

于 2011-01-16T15:10:22.750 回答