Hi guys,
I'm relatively new to Luabind and have a problem with using a shared_ptr created in C++ in Lua. This is the C++ code reduced to a minimum: struct Member { Member( int x ) : m_x( x ) {} int GetNum() { return m_x; } int m_x; }; template <class T> struct Foobar { typedef boost::shared_ptr<Foobar<T> > Ptr; Foobar( const T& value ) : x( value ) {} static Ptr Create( const T& value ) { return boost::shared_ptr<Foobar<T> >( new Foobar<T>( value ) ); } T& Get() { return x; } const T& Get() const { return x; } T x; }; The binding looks like follows: class_<Member>( "Member" ) .def( constructor<int>() ) .def( "GetNum", &Member::GetNum ) , class_<Foobar<Member*> >( "Foobar" ) .def( "Get", (Member*&(Foobar<Member*>::*)())&Foobar<Member*>::Get ) .scope [ def( "Create", (Foobar<Member*>::Ptr(*)( Member* ))&Foobar<Member*>::Create ) ] And the Lua code like that: member = debug.Member( 123 ) property = debug.Foobar.Create( member ) get = property:Get() print( get:GetNum() ) As soon as get:GetNum() is called, the program crashes. This is the backtrace: #0 0x00000000004ef1f6 in Member::GetNum (this=0x7b) at /home/stefan/code/games/cell/engine/src/cell/LuaBindExport.cpp:22 #1 0x0000000000511da0 in luabind::detail::invoke_member<int (Member::*)(), boost::mpl::vector2<int, Member&>, luabind::detail::null_type> (L=0x9e8b60, self=..., ctx=..., f=@0x9f5a90) at /usr/include/luabind/detail/call.hpp:283 #2 0x0000000000507722 in luabind::detail::invoke0<int (Member::*)(), boost::mpl::vector2<int, Member&>, luabind::detail::null_type, boost::is_void<int> > (L=0x9e8b60, self=..., ctx=..., f=@0x9f5a90, policies=...) at /usr/include/luabind/detail/call.hpp:78 #3 0x00000000005064ab in luabind::detail::invoke<int (Member::*)(), boost::mpl::vector2<int, Member&>, luabind::detail::null_type> (L=0x9e8b60, self=..., ctx=..., f=@0x9f5a90, policies=...) at /usr/include/luabind/detail/call.hpp:101 #4 0x0000000000505158 in luabind::detail::function_object_impl<int (Member::*)(), boost::mpl::vector2<int, Member&>, luabind::detail::null_type>::entry_point (L=0x9e8b60) at /usr/include/luabind/make_function.hpp:63 #5 0x00007ffff7bc0a56 in ?? () from /usr/lib/liblua5.1.so.0 #6 0x00007ffff7bcb811 in ?? () from /usr/lib/liblua5.1.so.0 #7 0x00007ffff7bc0fc5 in ?? () from /usr/lib/liblua5.1.so.0 #8 0x00007ffff7bc0647 in ?? () from /usr/lib/liblua5.1.so.0 #9 0x00007ffff7bc06c5 in ?? () from /usr/lib/liblua5.1.so.0 #10 0x00007ffff7bbc114 in lua_pcall () from /usr/lib/liblua5.1.so.0 #11 0x00000000004e3d23 in luabind::detail::proxy_function_void_caller<boost::tuples::tuple<boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> >::~proxy_function_void_caller (this=0x7fffffff9830, __in_chrg=<value optimized out>) at /usr/include/luabind/detail/call_function.hpp:262 So basically when returning a newly created boost::shared_ptr, there seems to go something wrong. After hours of debugging I just can't figure out why it happens. Greetings, Stefan. ------------------------------------------------------------------------------ All the data continuously generated in your IT infrastructure contains a definitive record of customers, application performance, security threats, fraudulent activity and more. Splunk takes this data and makes sense of it. Business sense. IT sense. Common sense.. http://p.sf.net/sfu/splunk-d2d-c1 _______________________________________________ luabind-user mailing list [hidden email] https://lists.sourceforge.net/lists/listinfo/luabind-user |
Free forum by Nabble | Edit this page |