Q:Часть API, которую я заворачиваю, выглядит примерно так:
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.
Даже связывание времени жизни от a до b через<with_custodian_and_ward>не мешает объекту питона a в конечном итоге попытаться удалить объект, на который он указывает. Есть ли способ осуществить «передачу владения» обернутым объектом C++?
Брюс Лоуэри
Да: Убедитесь, что объект C++ удерживается auto_ptr:
class_<A, std::auto_ptr<A> >("A")
...
;
Затем сделайте тонкую функцию обертки, которая принимает параметр auto_ptr:
void b_insert(B &b, std::auto_ptr<A> a)
{
b.insert(a.get());
a.release();
}
Заверните это как B.add. Обратите внимание, что указатели, возвращенные через<manage_new_object>, также будут удерживаться<auto_ptr>, поэтому эта передача права собственности также будет работать правильно.