I have a bp::wrapper wrapping an interface for use in python. Several functions return reference types of other objects, for example:
class IFoo { virtual const IBar& getBar() const = 0; } I found that to get boost python to handle this scenario correctly and eliminate any 'returning address of local variable' warnings I had to trick the result converter like so: class Foo_wrapper : IFoo, bp::wrapper< IFoo > { Bar _bar; const IBar& getBar() const { _bar = *(IBar*)this->get_override( "getBar" )(); // return *(IBar*)this->get_override( "getBar" )(); <- works as well but maybe less safe? } } I was messing with this problem for the last day and a half and this finally worked. From what I understand the method converter is tricked into returning an IBar* by the cast, then I use the copy constructor to make a concrete bar locally which is finally returned as a reference to the calling code. My first concern is if this is a 'proper' solution for this problem. I found that by just doing const IBar& getBar() const { return (IBar&)this->get_override( "getBar" )(); } I would get crashes because the object returned from get_override would be destroyed before I can copy it. IBar is abstract so most 'correct' uses will not work. If this solution is acceptable my question is how is the result converter dealing with the IBar* cast. Is it depending on me to delete the pointer? Does this solution cause massive memory leaks? Or will cleaning up the python object clean up the pointer as well? I want to implement a 'proper' solution to minimize future potential problems. Thank you _______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig