2012-12-06 35 views
1

我之前沒有使用過boost,所以如果我在做一些愚蠢的事情,請原諒我。我有一個持有lua_State的課程。我有我的push_back新的狀態,像這樣一個boost :: shared_ptr的矢量:添加了Lua的狀態在Boost中存儲多個Lua狀態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"); 
} 
}; 

代碼工作和,但幾秒鐘後,該應用程序崩潰。我爲此感到不知所措。當我手動執行它(沒有shared_ptrs和手動解引用)時它工作正常。

回答

3

您違反了3 的規則。您創建了一個非平凡的析構函數並分配構造函數,而不禁用或寫入複製構造函數和operator=

可能當您創建shared_ptr時,您正在做上述類的副本。然後這個臨時的東西被丟棄,事情就會興旺起來。

因此,首先禁用LuaState::operator=(LuaState const&)LuaState(LuaState const&)構造函數(構建一個未實現的私有版本,或者在C++ 11 delete中),或者實現它。

接下來,使用make_shared<LuaState>()來創建您的shared_ptr<LuaState>實例。這將創建它們「就地」並刪除副本。

我說的3條規則是什麼?看到這些鏈接:Rule of Three (Wikipedia),What is the Rule of Three?

+0

謝謝!它不再立即崩潰。該計劃有另一個奇怪但相關的問題。我有2個Lua腳本,並且在使用std :: vector單獨測試時都可以正常工作。如果我push_back這兩個腳本,他們都工作大約2分鐘,然後程序崩潰。當我手動運行兩個腳本時(手動創建兩個不帶std :: vector的Lua_State變量並手動「刪除」它們),它工作正常。我迷失在爲什麼這可能會發生。我甚至檢查共享指針是否有效(例如if(sharedPtr){}) – arao6

+0

@NicolBolas - 感謝您的編輯。是用肥胖的手指寫在智能手機上。 :) – Yakk