问题标签 [tolua++]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
214 浏览

c++ - 具有属性的 tolua++ 访问结构成员

我最初试图访问没有属性的结构成员,如下所示:

主文件:

pkg 文件:

但它没有用,问题在于将 char arry 转换为 lua 字符串,我无法按预期设置 var1 因为它是 char arry 而不是 lua 字符串,这会引发错误:“value is 'string'; 'table ' 预期的。”。好的,然后我向这些变量添加了属性,以便能够像这里一样访问它们:

问题:如您所见,我添加了能够访问这些变量并解决字符数组转换的属性,但即使它仍然会抛出“值是'字符串';预期的'表'”。我不明白为什么?可能是错误还是我做错了?lua代码:

0 投票
1 回答
424 浏览

lua - 创建特定用户类型的新实例

我正在使用 tolua++ 自动将 C++ 类型公开给 Lua。似乎当我暴露某种类型时,例如

tolua 所做的(至少在我看来是这样的)是向 lua 环境添加一个新的元表(在这种情况下,它只会被称为TestComponent)使用一些常规的元方法,例如__add, __lt, 以及__index,__newindex等。它还有一些自定义函数(称为.setand .get),当您获取或设置结构/类的某些成员时,它们似乎会被使用。这里的TestComponent 的类型似乎只是“table”。

但是,对于像上面这样的简单结构定义,它似乎缺少的是创建类型的新实例的函数/方法TestComponent,例如

那么,问题是,如何创建这种类型的新实例并将其分配给变量?例如,将它交给一个需要 type 参数的函数TestComponent

0 投票
2 回答
157 浏览

c++ - tolua++:将指针所有权转移到 lua gc

有没有办法将在堆上分配的对象返回到 lua 而不“缓存”对它们的引用?

考虑以下:

如果我将字符串返回到分配的内存,我必须删除它。有没有办法将所有权转移给lua?

或者甚至有可能让lua_state*我自己使用实现字符串返回lua_pushstring(...)

0 投票
1 回答
265 浏览

c++ - 使用 tolua_pushusertype_and_takeownership 时,toluapp 是否会造成内存泄漏?

这个问题可能是针对 Lua 和 tolua 专家的。

我正在使用 tolua++1.0.93 和 lua-5.1.4(CEGUI 0.84 依赖项)。我已经跟踪这个讨厌的内存泄漏几个小时了,我发现 toluapp 在 Lua 注册表中创建了 tolua_gc 表,并且该表似乎无限增长。

当我使用 tolua_pushusertype_and_takeownership 将我的对象推送到 Lua 时,我希望 Lua 的 GC 删除我的对象。它确实这样做了,但是 tolua_pushusertype_and_takeownership 调用 tolua_register_gc ,它把这个对象在 object 作为这个“全局” tolua_gc 表的键。当 tolua_gc_event 函数调用收集器函数(调用删除运算符)时,它将 nil 值设置为刚刚删除的对象下的 tolua_gc 表作为键。所以这应该有效,对吧?

嗯,不。

也许我理解错了,但这似乎对 tolua_gc 表的大小没有影响。我也尝试过从 Lua 手动调用 tolua.releaseownership(object) 。它奏效了。我的意思是,它减少了 Lua (LUA_GCCOUNT) 使用的内存,但由于它断开了收集器与对象的连接,因此永远不会调用 operator delete 并且它在 C++ 中造成内存泄漏。

这真的很奇怪,因为 tolua.releaseownership 所做的只是将 nil 值设置为传递对象下的 tolua_gc 表作为键。那么为什么 tolua.releaseownership 会减少 Lua 使用的内存大小,而 tolua_gc_event 不会呢?唯一的区别是 tolua.releaseownership 在将 nil 设置为 tolua_gc 表之前调用垃圾收集器,而 tolua_gc_event 由垃圾收集器调用(相反情况)。

为什么我们需要那个全局 tolua_gc 表?我们不能在收集的时候直接从对象中获取元表吗?

我可以从这个进程中使用的内存真的很有限(8MB),而且似乎这个 tolua_gc 表在一段时间后占据了它的 90%。

我怎样才能解决这个问题?

谢谢你。

编辑:这些是代码示例:

这是 .pkg 文件:

现在完成 Lua 代码(app 和 rootWindow 是作为常量提供给 Lua 的 C++ 对象):

这是我按下 0 1 0 1 0 1 0 时得到的输出:

这是我使用 tolua.releaseowenership 的时候

这没有 tolua.release 所有权:

这没有发布所有权,但我在键盘上按下的序列是 0 1 0 1 0 1 0 0 0 0 (最后对 GC 的三个额外调用)

0 投票
1 回答
79 浏览

c++ - 使用 tolua++ 时如何让 lua 拥有返回值的所有权?

这是我的 C++ 代码:

我知道函数何时返回,result将被释放,如果我在 lua 中调用它,lua 将一无所获。我需要new一个来禁止它被释放。但这会导致内存泄漏。所以我应该让 lua 拥有返回值的所有权。

我知道如何使用lua_State. 但是我使用注释将我的 c++ 函数暴露给 lua,所以我想知道是否有类似的方法来实现它?

0 投票
1 回答
89 浏览

c++ - 如何让tolua++在collect函数中调用自定义代码

标题几乎说明了一切。我不想 tolua++ 生成只调用的代码

在收集功能中。我希望它做这样的事情:

这可以在 .pkg 文件中指定吗?