gpt4 book ai didi

C++ & Lua Api,使用工厂函数就地分配

转载 作者:太空狗 更新时间:2023-10-29 21:44:50 25 4
gpt4 key购买 nike

我有一个在我的 C++ 代码和一些 Lua 脚本中使用的类。该类的相关部分如下所示:

typedef boost::shared_ptr<Thing> ThingPtr; // convenient

class Thing
{
public:
Thing() { /* do some stuff */ }
~virtual Thing() { }

ThingPtr createThing()
{
ThingPtr thing(new Thing);

// initialization can't be done in constructor
thing->doSomeInit();

return thing;
}

// other stuff....

};

我在 Lua 中公开了这个类(没有使用绑定(bind)或任何“花哨”的东西)。在添加工厂函数之前,我创建 Thing 的 Lua 函数如下所示:

int MyLua::newThing(lua_State* L)
{
int size = sizeof(Thing);

// allocate a new Thing object in place
new ((Thing*)lua_newuserdata(L, size)) Thing();

luaL_setmetatable(L, "MyStuff.thing");

return 1;
}

一旦我添加了工厂函数,我就做了类似的事情:

int MyLua::newThing(lua_State* L)
{
int size = sizeof(Thing);

// allocate a new Thing object in place
Thing* thing = new ((Thing*)lua_newuserdata(L, size)) Thing();
thing->doSomeInit();

luaL_setmetatable(L, "MyStuff.thing");

return 1;
}

这很好,看起来很好,只是现在我想将 Thing 的构造函数设为私有(private),以便在 C++ 代码的其他地方强制使用工厂函数。所以,现在我有类似的东西:

int MyLua::newThing(lua_State* L)
{
int size = sizeof(Thing);
ThingPtr thing = Thing::createThing();

void* space = lua_newuserdata(L, size);
memcpy(space, client.get(), size);

luaL_setmetatable(L, "MyStuff.thing");

return 1;
}

我的问题是:是否有更好的方法来做到这一点? memcpy 的调用让我感到不舒服。

最佳答案

您不能将 C++ 对象的所有权转移给 Lua。

您的原始代码有缺陷,因为它永远不会为您的 Thing 调用析构函数。虽然 Lua 会对通过 lua_newuserdata 分配的内存进行垃圾回收,但它不会调用对象的析构函数(因为 Lua 作为 C 库,不知道析构函数的概念)。

因此,您将需要在 C++ 端有一个单独的构造来管理对象的生命周期,并且只将原始(非拥有)指针传递给 Lua 以作为用户数据公开。

关于C++ & Lua Api,使用工厂函数就地分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19134815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com