tolua++: передача владения указателем в lua gc

Есть ли способ вернуть объекты, расположенные в куче, в lua без "кеширования" ссылок на них?

Учтите следующее:

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

Если я возвращаю строку в выделенную память, я должен удалить ее. Есть ли способ передать право собственности на Луа?

Или даже возможно получить lua_state* реализовать возврат строки самостоятельно lua_pushstring(...)?

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();
}

Вы можете передать вашу строку в Lua с помощью функции lua_pushstring и впоследствии освободить ее:

Вставляет строку с нулем в конце, на которую указывает s, в стек. Lua создает (или повторно использует) внутреннюю копию данной строки, поэтому память в s может быть освобождена или повторно использована сразу после возврата из функции. Строка не может содержать встроенные нули; предполагается, что он заканчивается на первом нуле.

Если вы действительно хотите, чтобы право собственности было передано, рассмотрите возможность обернуть вашу строку в соответствующий объект с его собственной метатаблизацией и реализацией. __gc функция.

Другие вопросы по тегам