【问题标题】:when do luabind free created objects?luabind 何时释放创建的对象?
【发布时间】:2011-01-17 19:28:05
【问题描述】:

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

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

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

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

你能帮帮我吗?

非常感谢:)

【问题讨论】:

  • 如果您发布更多代码,您可能会得到更好的答案:this 是什么类型以及导出方法的函数声明,以及调用这些函数的 Lua 代码。

标签: c++ lua luabind


【解决方案1】:

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

另一个有趣的想法可能是让您的 Lua 函数将“映射”生成为 Lua 表,将其返回,然后您可以在 C++ 中对其进行迭代以构建您的 std::map

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多