[C++-sig] pybindgen: allow_subclassing option causing reference parameters to be copied?

J. Michael Owen mikeowen at llnl.gov
Thu Jun 25 01:44:57 CEST 2009


I can see what you're worried about here, but as a practical matter it  
is very useful to be able to pass stuff by reference, and copying it  
under the hood will break code.  For instance, if the virtual  
functions modify the state of the parameters passed by reference it  
will just not function correctly when a copy is made.  Or in the  
example I sent when copy constructors are not available it won't even  
compile!

In Boost.Python this can be handled by wrapping the intermediate  
arguments with the boost::ref() function, which tells Boost.Python to  
pass the thing along as reference rather than making a copy and on my  
own head be it if I do something nefarious with that reference.  I  
guess what I would like in this case is the equivalent of an "on my  
own head be it" option.  This is kind of how I think of the pointer  
passing policy, like with the "caller_owns_return" option.  Wouldn't  
it be reasonable to allow us to specify optionally that references  
should not be copied, but rather passed along natively?  With the  
default policy still being the more memory safe option of doing the  
copy?

On Jun 24, 2009, at 3:31 PM, Gustavo Carneiro wrote:

> Sorry, but in this case the answer is no.  The virtual method  
> wrapper here receives a parameter from C++ and has to create a  
> Python wrapper for it.  The wrapper needs to own the object.  The  
> reason is that the Python method that is called may decide to keep a  
> reference to the object.  If the Python wrapper kept a "shared"  
> reference to the same C++ object then it could at some point in time  
> be keeping a reference to an object when the caller has already  
> deallocated it.
>
> To summarize, the object copy is done because the alternative would  
> be memory unsafe.
>
> This is one case where a C++ API blindly designed without  
> considering language bindings may make it difficult to bind later  
> on.  Ideally, in this case you should pass a pointer to A, and even  
> better A would have reference counting so that both caller and  
> callee could own a reference to the same object at the same time...



More information about the Cplusplus-sig mailing list