PrevUpHomeNext

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.

However:

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)
{
  b.insert(a.get());
  a.release();
}

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.


PrevUpHomeNext