luabridge绑定c++返回指针的函数,和绑定c++返回对象的函数区别

示例

返回对象写法
MatTest createMatTest(string txt) {
	MatTest res(txt);
	return res;
};

//返回指针写法
MatTest* createMatTest1(string txt) {
	return new MatTest(txt);
};

返回对象的写法lua自动释放内存
返回指针的对象自己释放内存

指针存储对象

/**
  Wraps a pointer to a class object inside a Lua userdata.

  The lifetime of the object is managed by C++.
*/
class UserdataPtr : public Userdata
{
private:
    UserdataPtr(UserdataPtr const&);
    UserdataPtr operator=(UserdataPtr const&);

private:
    /** Push a pointer to object using metatable key.
     */
    static void push(lua_State* L, const void* p, void const* const key)
    {
        new (lua_newuserdata(L, sizeof(UserdataPtr))) UserdataPtr(const_cast<void*>(p));
        lua_rawgetp(L, LUA_REGISTRYINDEX, key);
        if (!lua_istable(L, -1))
        {
            lua_pop(L, 1); // possibly: a nil
            throw std::logic_error("The class is not registered in LuaBridge");
        }
        lua_setmetatable(L, -2);
    }

返回对象

template<class T>
class UserdataValue : public Userdata
{
private:
    UserdataValue(UserdataValue<T> const&);
    UserdataValue<T> operator=(UserdataValue<T> const&);

    char m_storage[sizeof(T)];

private:
    /**
      Used for placement construction.
    */
    UserdataValue() { m_p = 0; }

    ~UserdataValue()
    {
        if (getPointer() != 0)
        {
            getObject()->~T();
        }
    }

public:
    /**
      Push a T via placement new.

      The caller is responsible for calling placement new using the
      returned uninitialized storage.

      @param L A Lua state.
      @returns An object referring to the newly created userdata value.
    */
    static UserdataValue<T>* place(lua_State* const L)
    {
        UserdataValue<T>* const ud =
            new (lua_newuserdata(L, sizeof(UserdataValue<T>))) UserdataValue<T>();
        lua_rawgetp(L, LUA_REGISTRYINDEX, detail::getClassRegistryKey<T>());
        if (!lua_istable(L, -1))
        {
            throw std::logic_error("The class is not registered in LuaBridge");
        }
        lua_setmetatable(L, -2);
        return ud;
    }

    /**
      Push T via copy construction from U.

      @tparam U A container type.
      @param  L A Lua state.
      @param  u A container object reference.
    */
    template<class U>
    static inline void push(lua_State* const L, U const& u)
    {
        UserdataValue<T>* ud = place(L);
        new (ud->getObject()) U(u);
        ud->commit();
    }

相关推荐

  1. C++11中引入bindfunction函数对象

    2024-07-11 17:08:06       25 阅读
  2. C# winform双向数据

    2024-07-11 17:08:06       40 阅读
  3. C++可调用对象包装器

    2024-07-11 17:08:06       23 阅读
  4. WPF中将多个函数返回值分别至界面控件

    2024-07-11 17:08:06       34 阅读
  5. 静态动态介绍?

    2024-07-11 17:08:06       38 阅读
  6. Qt 槽函数重载时通过函数指针

    2024-07-11 17:08:06       31 阅读
  7. QT5信号函数方式

    2024-07-11 17:08:06       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 17:08:06       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 17:08:06       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 17:08:06       58 阅读
  4. Python语言-面向对象

    2024-07-11 17:08:06       69 阅读

热门阅读

  1. Vue在使用el-image时显示加载失败问题

    2024-07-11 17:08:06       18 阅读
  2. Dell IdracSCv2020服务器硬件监控指标解读

    2024-07-11 17:08:06       18 阅读
  3. 学习STM32的加速度传感器

    2024-07-11 17:08:06       21 阅读
  4. ARM/Linux嵌入式面经(十三):紫光同芯嵌入式

    2024-07-11 17:08:06       21 阅读
  5. webpack之ts打包

    2024-07-11 17:08:06       22 阅读
  6. 【ARMv8/v9 GIC 系列 6 -- 中断优先级详细介绍】

    2024-07-11 17:08:06       27 阅读
  7. 科研入门笔记

    2024-07-11 17:08:06       23 阅读
  8. 1984. 学生分数的最小差值

    2024-07-11 17:08:06       20 阅读
  9. 探索数据的星群:SKlearn聚类中心计算方法全解析

    2024-07-11 17:08:06       24 阅读
  10. 移动互联安全扩展要求测评项

    2024-07-11 17:08:06       18 阅读