Skip to content

请教: 如何将C++返回的对象所有权交给Lua管理? #13

@datochan

Description

@datochan

你好,我一直使用这个库来完成C++和Lua的交互,确实很方便.

现在,我遇到一个问题:

我注册的C++函数会返回一个 对象, 我需要将这个对象的所有权交给Lua管理,在lua中不使用时就将其内存释放, 例如我注册的函数为:

class BlockDataObject
{
public:
    EntityBlockIndex* indexWithCode(QString code);

    ...

注册函数的方法为:

    ELuna::registerClass<EntityBlockIndex>(L, "BlockIndex", ELuna::constructor<EntityBlockIndex,QmtExchangeId,QString,QString,int,QString,bool>);
    ELuna::registerMethod<EntityBlockIndex>(L, "code", &EntityBlockIndex::code);
    ELuna::registerMethod<EntityBlockIndex>(L, "name", &EntityBlockIndex::name);
    ELuna::registerMethod<EntityBlockIndex>(L, "type", &EntityBlockIndex::type);
    ....
    ELuna::registerClass<BlockDataObject>(L, "BlockDataObject", ELuna::constructor<BlockDataObject,QString,ELuna::LuaTable>);
    ELuna::registerMethod<BlockDataObject>(L, "indexWithCode", &BlockDataObject::indexWithCode);
    ....

indexWithCode方法的返回值需要交给Lua去管理, 否则就内存泄露了. 我发现咱库中有一个函数:

template<typename T>
inline int inject(lua_State *L, T* objPtr) {
      UserGCData<T>* ud = static_cast<UserGCData<T>*>(lua_newuserdata(L, sizeof(UserGCData<T>)));
      new(ud) UserGCData<T>(objPtr);

	luaL_getmetatable(L, ClassName<T>::getName());
	lua_setmetatable(L, -2); // self.metatable = uniqe_metatable

	return 1;
}

它可以将我要返回的对象包装成 UserGCData实现我的效果, 但是我注册的函数indexWithCode的返回值要怎么改?

我现在卡在这里了, 不知道要怎么继续了,还望大佬能给解惑~

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions