[C++-sig] Re: Shared Pointers and Boost.Python

David Abrahams dave at boost-consulting.com
Mon Jul 26 02:56:50 CEST 2004


Ingo Lütkebohle <ingo at fargonauten.de> writes:

> Am Sat, 24 Jul 2004 10:39:50 -0400 schrieb David Abrahams:
>> You might want to use register_ptr_to_python<shared_ptr<X> >() for
>> some shared pointers if you ever create them from C++ code,
>
> Whats the difference between calling that method

It's a regular function template, not a method.

> and specifying a shared_ptr in the class_ call?  I noticed the two
> are mutually exclusive (getting a failed assertion at runtime
> otherwise).

The _warning_ (it should be a warning, not an assertion -- if it's an
assertion something is very wrong) is because both of them register a
converter from shared_ptr<X> to the Python class corresponding to X,
and Boost.Python warns whenever duplicate to-python converters are
registered.

Specifying a shared_ptr in the class_<...> argument list like

           class_<X,shared_ptr<X>, ...>

additionally means that when you create an instance of the Python
class corresponding to X, it holds the X instance via shared_ptr<X>.
The only upshot is that you can pass these Python X instances to a
wrapped C++ function that takes a shared_ptr<X> by non-const reference
(rather than by value), since there really is a persistent shared_ptr
that can be modified.  The shared_ptr<T> created when you call a
wrapped C++ function taking a shared_ptr<T> by value is normally
created on-the-fly for each function call.

> I'm commonly using factory methods where the smart ptr is instantiated on
> the C++ side.  Mostly using std::auto_ptr.  I once had problems using
> a boost::shared_ptr instead (hung on when calling 'del' from python). 
> Could that be a related problem?

Related?  I guess.  You haven't given much detail so it could be
almost anything I suppose.

-- 
Dave Abrahams
Boost Consulting
http://www.boost-consulting.com




More information about the Cplusplus-sig mailing list