1

私は以前にブーストを使用したことがないので、ばかげたことをしている場合はご容赦ください。lua_State を保持するクラスがあります。次のように新しい状態を push_back する 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と手動での逆参照なしで)正常に機能します。

4

1 に答える 1

3

あなたは 3 1のルールに違反しています。コピー コンストラクターを無効にしたり記述したりせずに、非自明なデストラクタと割り当てコンストラクタを作成しましたoperator=

おそらく、作成時にshared_ptr上記のクラスのコピーを作成しています。その後、一時的なものは破棄され、物事はブームになります。

したがって、最初LuaState::operator=(LuaState const&)LuaState(LuaState const&)コンストラクターを無効にして (非実装の非公開バージョンを作成するか、C++11deleteでそれを) 実装するか、それを実装します。

次に、 を使用make_shared<LuaState>()してインスタンスを作成しshared_ptr<LuaState>ます。これにより、それらが「その場で」作成され、コピーが削除されます。

1私が話しているこの 3 のルールとは何ですか? 次のリンクを参照してください: Rule of Three (Wikipedia) , What is the Rule of Three?

于 2012-12-06T16:17:57.083 に答える