在Boost shared_ptr中存储多个Lua状态

时间:2012-12-06 15:54:11

标签: c++ pointers boost lua

我之前没有使用过boost,所以请原谅我,如果我做的事情很傻。我有一个持有lua_State的类。我有一个boost :: shared_ptr向量,我推送新状态如下:

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和手动取消引用)时工作正常。

1 个答案:

答案 0 :(得分:3)

您违反了3 1 的规则。您创建了一个非平凡的析构函数并分配构造函数,而不禁用或编写复制构造函数和operator=

当您创建shared_ptr时,您正在复制上述课程。然后丢弃临时物,事情就会兴旺起来。

因此,首先禁用LuaState::operator=(LuaState const&)LuaState(LuaState const&)构造函数(制作一个私有的非实现版本,或者在C ++ 11中delete),或者实现它。

接下来,使用make_shared<LuaState>()创建shared_ptr<LuaState>个实例。这将创建它们“就地”并删除副本。

1 我说的3条规则是什么?请参阅以下链接:Rule of Three (Wikipedia)What is the Rule of Three?