2009-12-21 5 views
3

En utilisant C++, Lua 5.1, luabind 0.7-0.81Enregistrement d'une classe lua avec les parents dans luabind :: objet

Essayer de créer une classe lua avec les parents et le stocker dans un luabind :: objet.

Lua

class 'TestClassParent' 
function TestClassParent:__init() 
    print('parent init\n') 
end 
function TestClassParent:__finalize() 
    print('parent finalize\n') 
end 

class 'TestClass' (TestClassParent) 
function TestClass:__init() 
    print('init\n') 
    TestClassParent.__init(self) 
end 
function TestClass:__finalize() 
    print('finalize\n') 
end 

C++

{ 
    luabind::object obj = luabind::call_function<luabind::object>(lua_state, "TestClass"); 
} 
printf("before GC\n"); 
lua_gc(lua, LUA_GCCOLLECT, 0); 
printf("after GC\n"); 

sortie:

parent d'initialisation d'initialisation

avant GC après GC

Résultat: Après obj est détruit, l'instance 'TestClass est de toujours en vie après le cycle de collecte des ordures (méthode __finalize est pas appelée et la mémoire ne soit pas libérée). Il détruit seulement à la sortie du programme.
Moresome Si j'utilise la classe sans parent, les ordures sont collectées correctement.

Si je tente d'utiliser adopter une politique (pour prendre possession de l'objet créé)

luabind::object obj = luabind::call_function<luabind::object>(lua_state, "TestClass")[luabind::adopt(luabind::result)]; 

Je reçois:

  • dans luabind 0,7 - même résultat que sans adopter une politique
  • dans luabind 0.81 - crash avec message "vous essayez d'utiliser un type unregistrerd"

Comment puis-je correctement créer un objet lua en C++ et prendre est la propriété?

Répondre

1

Modifier: après la mise à jour de l'OP, cette réponse n'est plus pertinente, je vais la laisser pendre ici. Daniel Wallin a posté la réponse

pas vraiment une réponse, mais je perdrais la mise en forme avec un commentaire

Je ne peux pas reproduire celui-ci. Voici le code exact que je l'utilise:

// initialization 
lua_State* lua = lua_open(); 
luaL_openlibs(lua); 
luabind::open(lua); 
// declare class 
luaL_loadstring(lua, 
    "class 'TestClass'\ 
    function TestClass:__init() print('init') end\ 
    function TestClass:__finalize() print('finalize') end"); 
lua_pcall(lua, 0, LUA_MULTRET, 0); 
// instantiate 
{ 
    luabind::object obj = luabind::call_function<luabind::object>(lua, "TestClass"); 
} 
// collect 
printf("Before GC collect\n"); 
lua_gc(lua, LUA_GCCOLLECT, 0); 
printf("After GC collect\n"); 
lua_close(lua); 

Et le résultat que je reçois est:

init 
Before GC collect 
finalize 
After GC collect 

J'utilise Lua 5.1.4, luabind 0.81 avec VC8 (alias VS2005) SP1

+0

Merci beaucoup pour le test. Tu as raison. Ma description d'un problème n'était pas correcte. C'est réel seulement quand la classe a un parent. J'ai mis à jour une description dans le message principal. – kFk

Questions connexes