[C++-sig] Transfer of ownership

David Abrahams dave at boost-consulting.com
Mon Aug 15 16:43:30 CEST 2005


Eric Jardim <ericjardim at gmail.com> writes:

> Hi, all...
>
> This is a simple question. I was reading the docs where it says about the 
> "transfer of ownership" of a C++ object pointer. I am dealing exacly this 
> situation, where the "with_custodian_and_ward" policy is not enough to 
> prevent Python objects to delete C++ couterparts. The only hack is to hold 
> references, but it is not a complete solution.
>
> So, I read the FAQ entry where it explain how to deal with this issue:
> http://www.boost.org/libs/python/doc/v2/faq.html#ownership
>
> But there, it speaks about using an "std::auto_ptr". On the other side, I am 
> using "boost::shared_ptr" to hold my objects. I really do not know the 
> difference between them, but I imagine they provide similar
> funcionality. 

Yes, similar, but auto_ptr provides exclusive, as opposed to shared,
ownership semantics.  When an auto_ptr is copied or assigned, the
source loses ownership and the destination acquires it.

> So I will split my question in 3 parts:
> - Is it possible to take the ownership with "boost::shared_ptr", 

Not if you mean to substitute it in the example in the FAQ, no.

> or do I have to change my held types to "std::auto_ptr"?

That's a completely separate question.  No, you don't need to change
your held types.

> - Is there any difference in practice, using boost's or std's smart 
> pointers? 

Yes, there are lots of differences.  However you haven't been very
specific about what you're interested in; you'd have to read the
documentation for each of them to grasp all of the differences.

> I just use them for holding Boost.Python extensions.

> - As those functions with smart pointers do not exists, I suppose
> that I will have to write wrappers like:
>
> void b_insert(B& b, std::auto_ptr<A> a)
> {
>     b.insert(a.get());
>     a.release();
> }
>
> Is there any special reason for this to be a non-const reference to
> "b"? 

Yes, all free functions that are going to be wrapped as class methods
should take a non-const reference as their first argument.
 
> Could it be a const reference

That would allow an implicit conversion from some other type to B to
take place when calling the method, since const references can bind to rvalues

> or a const/non-const pointer to "b"? 

That would allow None to be passed as the first argument, resulting in
a NULL pointer.

-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com




More information about the Cplusplus-sig mailing list