2012-12-06 2 views
1

Je n'ai jamais utilisé boost avant, alors pardonnez-moi si je fais quelque chose de stupide. J'ai une classe qui détient un lua_State. J'ai un boost :: vecteur shared_ptr que je push_back nouveaux Etats comme ceci:Stocker plusieurs états Lua dans un 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"); 
} 
}; 

Les œuvres de code et l'état Lua est ajouté, mais après quelques secondes l'application se bloque. Je ne sais pas pourquoi cela se produit. Cela fonctionne bien quand je le fais manuellement (sans shared_ptrs et dereferencing manuellement).

Répondre

3

Vous avez enfreint la règle de 3 . Vous avez créé un destructeur non trivial et un constructeur d'allocation sans désactiver ou écrire un constructeur de copie et operator=.

Probablement lorsque vous créez le shared_ptr vous faites une copie de la classe ci-dessus. Le temporaire est ensuite mis au rebut et les choses vont boum. Donc, d'abord désactiver le constructeur LuaState::operator=(LuaState const&) et LuaState(LuaState const&) (faire une version privée non implémentée, ou en C++ 11 delete), ou l'implémenter. Puis, utilisez make_shared<LuaState>() pour créer vos instances shared_ptr<LuaState>. Cela les créera "en place" et supprimera la copie.

Quelle est cette règle de 3 dont je parle? Voir ces liens: Rule of Three (Wikipedia), What is the Rule of Three?

+0

Merci! Il ne se bloque plus immédiatement. Le programme a un autre problème étrange mais connexe. J'ai 2 scripts Lua, et les deux fonctionnent bien lorsqu'ils sont testés individuellement avec std :: vector. Si je repousse les deux scripts, ils fonctionnent tous les deux pendant environ 2 minutes, puis le programme se bloque. Cela fonctionne correctement lorsque je cours les deux scripts manuellement (en créant manuellement deux variables Lua_State sans un vecteur std :: et en les "supprimant" manuellement). Je suis perdu quant à la raison pour laquelle cela peut arriver. Je vérifie même si le pointeur partagé est valide (par exemple si (sharedPtr) {}) – arao6

+0

@NicolBolas - merci pour l'édition. Était l'écrire sur un smartphone avec de gros doigts. :) – Yakk