【问题标题】:Storing multiple Lua states in a Boost shared_ptr在 Boost shared_ptr 中存储多个 Lua 状态
【发布时间】:2012-11-24 16:58:16
【问题描述】:

我之前没有使用过boost,如果我做了一些愚蠢的事情,请原谅我。我有一个包含 lua_State 的类。我有一个 boost::shared_ptr 向量,我像这样 push_back 新状态:

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 和手动取消引用)。

【问题讨论】:

    标签: c++ pointers boost lua


    【解决方案1】:

    你违反了 31 的规则。您创建了一个重要的析构函数并分配构造函数,而没有禁用或编写复制构造函数和operator=

    可能当您创建shared_ptr 时,您正在复制上述课程。临时的然后被丢弃,事情进展顺利。

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

    接下来,使用make_shared&lt;LuaState&gt;() 创建您的shared_ptr&lt;LuaState&gt; 实例。这将“就地”创建它们并删除副本。

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

    【讨论】:

    • 谢谢!它不再立即崩溃。该程序还有另一个奇怪但相关的问题。我有 2 个 Lua 脚本,并且在使用 std::vector 单独测试时都可以正常工作。如果我 push_back 两个脚本,它们都工作大约 2 分钟,然后程序崩溃。当我手动运行这两个脚本时它工作正常(通过手动创建两个没有 std::vector 的 Lua_State 变量并手动“删除”它们)。我不知道为什么会发生这种情况。我什至正在检查共享指针是否有效(例如 if (sharedPtr) { } )
    • @NicolBolas -- 感谢您的编辑。用胖手指在智能手机上写。 :)
    猜你喜欢
    • 2019-06-29
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2015-07-25
    相关资源
    最近更新 更多