shared_ptr的需要完整的类型;不能lua_State使用*
-
19-09-2019 - |
题
我正在写为lua一个C ++ / OOP包装。我的代码是:
class LuaState
{
boost::shared_ptr<lua_State> L;
LuaState(): L( luaL_newstate(), LuaState::CustomDeleter )
{
}
}
问题是lua_State是不完全的类型和shared_ptr的构造需要完整类型。我需要安全指针共享。 (有趣的升压文件说大多数功能并不需要完整的类型,但构造要求,所以没有使用它的方式。的 http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/smart_ptr.htm )
可我能解决这个问题?谢谢你。
解决方案
您使用的是自己删除器,这意味着你不必有在建设一个完整的类型。唯一的要求是,CustomDeleter
就可以搞定。 (它可将传递到一个完整的类型,例如(比方说指针,从void*
到CompleteType*
)。
完整性的背景是,一旦shared_ptr
的构造函数被调用以默认删除器,它将实例包含行delete p;
一类 - 并且根据这个码是正确的,p
不能是不完整的。析构函数会间接调用这个删除器的代码,所以它不依赖于该类型的完整性。
不过,如果你通过自己的缺失者,你自己缺失者的要求适用。确保CustomDeleter
已成为完成后确定lua_State
。
其他提示
这似乎奇怪boost::shared_ptr
将需要用于实例化,一个完整的类型,所以我写这个小的小测试演示相反(末尾代码)。
我认为,这个问题是不是与类型需要是完整的,但要传递到shared_ptr
构造函数的第二个参数,看起来像一个成员函数。第二个参数必须是一个指针参数的东西调用。如果你想使用你的包装的成员函数可以使用boost::bind
适应界面。
也许你的意思是:
LuaState(): L( luaL_newstate(), boost::bind(LuaState::CustomDeleter,this,_1) )
{
}
示范该boost::shared_ptr
不需要完整类型:
// forward declarations
struct test;
test * create();
void destroy(test *);
// wrapper equivalent to the one in the question
struct wrapper {
boost::shared_ptr<test> sp;
wrapper() : sp( create(), destroy ) {}
};
// actual definitions
struct test {};
test * create() { return new test; }
void destroy(test *t) { delete t; }
// make it executable
int main() {
test t;
}
假定一个lua_State *无法克隆,被复制LuaState对象有意义?什么是复制这样一种固有的不可复制对象的预期语义?
您似乎想要的行为的浅复制的 - 要做到这一点是LuaState是不可复制和管理lua_State的寿命那么就可以在状态传递作为shared_ptr<LuaState>
的最佳途径