Re: Preventing garbage collection of objects created with Luabind
Tony Kostanjsek <[email protected]>
| Newsgroups | gmane.comp.lang.lua.bind.user |
|---|---|
| Message-ID | <[email protected]> |
are smart pointers an option? ________________________________ Von: Greg Santucci <[email protected]> An: [email protected] Gesendet: Donnerstag, den 25. Februar 2010, 1:49:13 Uhr Betreff: [luabind] Preventing garbage collection of objects created with Luabind Hi Luabinders, I've registered some functions of an stl vector using Luabind the following way without any problems: module(g_pLuaState) [ class_<std::vector<Component *>>("ComponentSet") .def(constructor<>()) .def("push_back",&std::vector<Component *>::push_back) .def("at",(Component*&(std::vector<Component *>::*)(size_t))&std::vector<Component *>::at) ]; module(g_pLuaState) [ class_<Component>("Component") .def(constructor<>()) .def("GetPtr", &Component::GetPtr) .def("Speak", &Component::Speak) ]; module(g_pLuaState) [ class_<Lamp, bases<Component>>("Lamp") .def(constructor<>()) ]; module(g_pLuaState) [ class_<Relay, bases<Component>>("Relay") .def(constructor<>()) ]; At the Lua repl, I can instance this vector, and add elements to it: > c = ComponentSet() > c:push_back(Relay():GetPtr()) > c:push_back(Lamp():GetPtr()) And I can access the contents of the vector: > print(c:at(0):Speak()) Relay > print(c:at(1):Speak()) Lamp However, eventually, the Relay and Lamp objects I created earlier will be garbage collected, since they aren't bound to anything that Lua can see, so if I continue accessing the vector in this way, after about 14 or so accesses, I get the following error message: > print(c:at(0):Speak()) std::exception: 'Access violation - no RTTI data!' Naturally, if I do this instead: > c = ComponentSet() > r1 = Relay() > l1 = Lamp() > c:push_back(r1:GetPtr()) > c:push_back(l1:GetPtr()) This problem doesn't occur. My question is, is there a way to prevent these vector elements from being garbage collected without having to keep another list of them in lua? Also, I had to define a GetPtr() function for the Component class which looks like this: Component * Component::GetPtr() { return this; } Is there a way I can get to the pointer from Lua without having to create this function? Just want to finish up by saying Lua and Luabind are awesome, and I am grateful to the authors and maintainers of these tools. Regards, Greg Santucci __________________________________________________ Do You Yahoo!? Sie sind Spam leid? Yahoo! Mail verfügt über einen herausragenden Schutz gegen Massenmails. http://mail.yahoo.com ------------------------------------------------------------------------------ Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev _______________________________________________ luabind-user mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/luabind-user