在 luabind 中返回指向派生对象的指针时,可能会出现泄漏或“未注册类”的问题。
2013-3-20 14:7:55
收藏:0
阅读:117
评论:1
我通过 luabind 将我的应用程序的内部暴露给 Lua,在 C++ 中我有一个具有 shared_ptr<Item> 的 Container,其中 Item 是一个抽象基类。派生类包括 ItemA 和 ItemB。
为了使这些项目暴露给 luabind,我使用了几个包装类(因为我希望容器在脚本界面中具有不同的编辑机制)。我希望能够在 Lua 脚本中枚举容器中的项,如下所示:
container=app.container
for i,event in ipairs(container.items) do
print(tostring(event))
end
我的问题是,我可以通过返回指向 ItemWrapper 的原始指针来公开此功能,但这会导致内存泄漏,因为 ItemWrapper 析构函数从未被调用。如果我试图在 luabind 中声明包装器作为智能指针 如文档中所述,那么当我尝试将智能指针作为 lua 对象返回时,就会抛出 'Trying to use unregistered class' 异常。
包装器的定义如下:
class ContainerWrapper {
public:
ContainerWrapper(Container& c) : container(c) {};
Container& c; // reference to the actual container
};
class ItemWrapper {
public:
virtual ~ItemWrapper() {};
ItemWrapper(int itemIndex_) : itemIndex(itemIndex_) {};
int itemIndex; // items are addressed by index
};
class ItemAWrapper : public ItemWrapper {
public:
ItemAWrapper(int itemIndex_) : ItemWrapper(itemIndex_) {};
};
luabind 注册如下:(如果我不使用智能指针)
class_<ItemWrapper>("Item") ,
class_<ItemAWrapper, ItemWrapper>("ItemA")
如果使用以下注册,则显示如下:
class_<ItemWrapper, std::tr1::shared_ptr<ItemWrapper> >("Item") ,
class_<ItemAWrapper, ItemWrapper, std::tr1::shared_ptr<ItemWrapper> >("ItemA")
暴露 Container 的 items 成员的函数返回一个 Lua 表:
luabind::object Container::getItemsAsTable(lua_State* L)
{
luabind::object table=luabind::newtable(L);
for (int i=0; i<items.size(); i++) {
table[i+1]= new ItemAWrapper(); // or function to return pointer/smart pointer
}
return table;
}
这是在表中设置值的正确方式吗?如果我传递智能指针,则这会生成异常,但如果我传递原始指针,则似乎不会将其分配到智能指针中,并且对象将泄漏。进行垃圾回收也没有帮助。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

Lua 已经是多态的了。所以你的
getItemsAsTable函数不需要new这些ItemWrapper对象。只需要把值放进去就可以了。像这样:table[i+1] = ItemAWrapper()。除非有什么特殊情况需要使用指针(比如改变 Lua 表应该反映在 C++ 中),否则不要费心思,直接使用值就可以了。