【问题标题】:tolua++: Transfer pointer ownership to lua gctolua++:将指针所有权转移到 lua gc
【发布时间】:2016-04-15 14:50:43
【问题描述】:

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

考虑以下几点:

class foo
{
    char const* bar() const
    {
        char* s = malloc(...);
        ...
        return s; // << Leak. How to transfer the ownership of 's' to lua?
    }
};

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

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

【问题讨论】:

    标签: c++ lua lua-api tolua++


    【解决方案1】:

    您可以使用 lua_pushstring 函数将您的字符串传递到 Lua 并在之后释放它:

    将 s 指向的以零结尾的字符串压入堆栈。 Lua 制作(或重用)给定字符串的内部副本,因此 在函数返回后可以立即释放或重用 s 处的内存。字符串不能包含嵌入的零;假设它在第一个零处结束。

    如果您确实希望转让所有权,请考虑将您的字符串包装成适当的 object 并使用其自己的元表并实现 __gc 函数。

    【讨论】:

    • push_string 的问题是我无法在我的 c++ 函数中访问lua_state (?)
    【解决方案2】:

    通过声明一个参数 'lua_Sate* state' tolua++ 会将 Lua-State 传递给函数。

    使用“lua_Object”类型的返回类型,您可以将堆栈索引返回到 lua 对象。

    PKG

    lua_Object MyFunctionReturningATable(lua_State* s);
    

    CPP

    lua_Object MyFunctionReturningATable(lua_State* s)
    {
        lua_newtable(s);
    
        ...
    
        return lua_gettop();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多