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).
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
@NicolBolas - merci pour l'édition. Était l'écrire sur un smartphone avec de gros doigts. :) – Yakk