Boost C++ Libraries of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards


How can I wrap a function which needs to take ownership of a raw pointer?

Q: Part of an API that I'm wrapping goes something like this:

struct A {}; struct B { void add( A* ); }
where B::add() takes ownership of the pointer passed to it.


a = mod.A()
b = mod.B()
b.add( a )
del a
del b
# python interpreter crashes
# later due to memory corruption.

Even binding the lifetime of a to b via with_custodian_and_ward doesn't prevent the python object a from ultimately trying to delete the object it's pointing to. Is there a way to accomplish a 'transfer-of-ownership' of a wrapped C++ object?

--Bruce Lowery

Yes: Make sure the C++ object is held by auto_ptr:

class_<A, std::auto_ptr<A> >("A")

Then make a thin wrapper function which takes an auto_ptr parameter:

void b_insert(B &b, std::auto_ptr<A> a)

Wrap that as B.add. Note that pointers returned via manage_new_object will also be held by auto_ptr, so this transfer-of-ownership will also work correctly.