我以前没有使用过Boost,所以如果我做傻事,请原谅我。我有一个包含lua_State的类。我有一个boost::shared_ptr vector ,我将其像这样推入新状态:
class Lua_State
{
lua_State *L;
std::string m_scr;
public:
Lua_State() : L(luaL_newstate())
{
lua_register(L, "test", test);
luaL_openlibs(L);
}
~Lua_State() {
lua_close(L);
}
inline bool LoadScript(const char* script)
{
if (!boost::filesystem::exists(script))
return false;
m_scr = fs::path(std::string(script)).filename().string();
chdir(fs::path(scr).parent_path().string().c_str());
if (luaL_loadfile(L, m_scr.c_str()))
return false;
// prime
if (lua_pcall(L, 0, 0, 0))
return false;
return true;
}
};
typedef boost::shared_ptr<Lua_State> LUASTATEPTR;
class Scripts
{
private:
std::vector<LUASTATEPTR> m_Scripts;
public:
Scripts() { }
void TestLoad()
{
m_Scripts.push_back(LUASTATEPTR(new Lua_State()));
LUASTATEPTR pState = m_Scripts[0];
pState->LoadScript("C:/test.lua");
}
};
该代码有效,并添加了Lua状态,但是几秒钟后该应用程序崩溃了。我不知道为什么会这样。当我手动执行此操作(没有shared_ptrs和手动取消引用)时,它可以正常工作。
最佳答案
您违反了31条规则。您创建了一个非平凡的析构函数并分配了构造函数,而没有禁用或编写复制构造函数和operator=
。
创建shared_ptr
时,可能是在复制上述类。临时物品随后被丢弃,事情开始兴隆。
因此,首先禁用LuaState::operator=(LuaState const&)
和LuaState(LuaState const&)
构造函数(创建私有(private)的未实现版本,或在C++ 11中将其生成delete
),或实现它。
接下来,使用make_shared<LuaState>()
创建您的shared_ptr<LuaState>
实例。这将“就地”创建它们并删除副本。
1我说的这3条规则是什么?请参阅以下链接:Rule of Three (Wikipedia),What is the Rule of Three?
关于c++ - 在Boost shared_ptr中存储多个Lua状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13747429/