shared_ptr需要完整类型;不能与lua_State*一起使用。
2010-3-12 15:17:52
收藏:0
阅读:232
评论:3
我正在为 Lua 编写一个 C++/OOP 包装器。我写的代码是:
class LuaState
{
boost::shared_ptr<lua_State> L;
LuaState(): L( luaL_newstate(), LuaState::CustomDeleter )
{
}
}
问题是 lua_State 是一个不完整类型,而 shared_ptr 构造函数需要完整类型。我需要安全指针共享。(有趣的是 boost 文档说大多数函数不需要完整类型,但构造函数需要,所以没有使用的方法。http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/smart_ptr.htm)
有什么解决方法吗?谢谢。
原文链接 https://stackoverflow.com/questions/2433667
点赞
stackoverflow用户36565
看起来 boost::shared_ptr
要求在实例化时需要一个完整的类型似乎有些奇怪,因此我写了这个小测试来证明相反的结果(代码在最后)。
我认为问题不在于需要完整的类型,而是你传递给 shared_ptr
构造函数的第二个参数,它看起来像一个成员函数。第二个参数必须是可调用单个指针参数的内容。如果你想要使用包装器的成员函数,你可以使用 boost::bind
来适配接口。
也许你的意思是?:
LuaState(): L( luaL_newstate(), boost::bind(LuaState::CustomDeleter,this,_1) )
{
}
证明 boost::shared_ptr
不需要完整类型:
// 前向声明
struct test;
test * create();
void destroy(test *);
// 与问题中的包装器相等的包装器
struct wrapper {
boost::shared_ptr<test> sp;
wrapper() : sp( create(), destroy ) {}
};
// 实际定义
struct test {};
test * create() { return new test; }
void destroy(test *t) { delete t; }
// 使其可执行
int main() {
test t;
}
2010-03-12 16:14:38
stackoverflow用户59379
考虑到无法克隆 lua_State*,复制 LuaState 对象是否有意义?复制这样一个不可复制的对象的预期语义是什么?
你似乎想要的行为是 _浅复制_,最好的方法是让 LuaState 无法复制,并管理 lua_State 的生命周期,然后你可以将该状态作为 shared_ptr<LuaState>
传递。
2010-03-12 16:20:54
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
您正在使用自己的删除器,这意味着您在构建时不必拥有完整类型。唯一的要求是“CustomDeleter”可以处理它。(例如,它可能将传递的指针转换为完整类型,比如(从
void*
转换为CompleteType*
)。完整性的背景是,一旦使用默认的删除器调用
shared_ptr
的构造函数,它将实例化一个包含delete p;
这一行的类。为了使该代码正确,p
不得不是不完整的。析构函数将间接调用此删除器代码,因此不依赖于类型的完整性。但是,如果您传递自己的删除器,则会应用自己删除器的要求。请务必在
lua_State
已经完成后定义CustomDeleter
。