【问题标题】:Odd Problem with luabind::objectluabind::object 的奇怪问题
【发布时间】:2011-09-01 05:03:40
【问题描述】:

我目前正在使用 luabind,特别是 https://github.com/rpavlik/luabind,因为官方版本已经过时并且不再使用最新版本的 boost 进行编译。

我遇到了一个非常奇怪的问题,我在网上的任何地方都找不到。我设法将案例简化为一个非常简单的场景。

在一个模块中,我将拥有:

luabind::object value;

void functionA() {
    lua_pushstring(L,"yo");
    luabind::object temp(luabind::from_stack(L,-1));
    value = temp;
}

在另一个模块中,我将拥有:

void functionB() {
    printf("My Value: %s\n",luabind::object_cast<const char*>(value));
    printf("My Original value type: %d\n",luabind::type(value));
    value.push(L);
    luabind::object a1(luabind::from_stack(L,-1));
    printf("My Copy value type: %d\n",luabind::type(a1));
}

当我从 lua 中获取 functionA 和 functionB 并连续调用它们时,输出将是:

My Value: yo
My Original value type: 4
My Copy value type: 0

如您所见,该对象仍然引用了 luabind 可以打印的内容。但是当我尝试将它压入堆栈并从堆栈对象创建一个新对象时,它会产生一个 nil 值。

这只发生在这种特定情况下。当我把所有东西都放在一个函数中时,它工作得很好。当我将代码放入同一个模块的函数中时,它会正常工作。我还没有做一个独立的测试项目,但是我想不出我的代码中有什么干扰,函数是直接从lua调用的。

我做错了吗?或者这是一个错误?如果是bug,我怎么从来没有听说过这样的事情?

【问题讨论】:

  • 我很好奇您是否可以通过删除 Luabind 并仅使用 Lua C API 来进一步简化测试用例(显然您可以 - 通过复制/粘贴 - 但问题是有趣的“错误”在 Lua 或 Luabind 中)。
  • @John Zwinck:可能不会,因为使用 luabind 包装的类是触发错误的先决条件。我什至不知道我是否想尝试理解如何将一个函数放入由 luabind 包装的类中(函数本身不需要包装)会导致行为发生变化。

标签: lua luabind


【解决方案1】:

看来我的测试用例不完整。 functionB 也需要在一个由 luabind 包装的类中。我可以通过使类中的函数成为代理函数并从那里调用包含我的代码的全局函数来“解决”这个问题。

【讨论】:

  • 那么这听起来像是一个错误。我不知道你为什么没有听说过——也许那个特定的场景并不经常发生。如果你能把它作为一个像这样的小测试程序:github.com/rpavlik/luabind/blob/master/test/… 我可以将它添加到我分支的测试套件中。您可以尝试询问 luabind 邮件列表,特别是如果您有自动化测试 - 那里的人可能知道。
猜你喜欢
  • 1970-01-01
  • 2015-02-27
  • 2018-06-26
  • 2011-08-13
  • 2011-08-17
  • 2011-02-02
  • 2021-10-10
  • 2014-04-21
  • 2010-12-30
相关资源
最近更新 更多