boost::python
знает все о boost::shared_ptr
, но вы должны сказать ему, что boost::shared_ptr<A>
содержит экземпляр A
, вы делаете это, добавляя boost::shared_ptr<A>
в списке аргументов шаблона к class_
, большеинформация об этом 'Held Type' здесь, в документации по бустеру .
Чтобы предотвратить создание экземпляров из python, вы добавляете boost::python::no_init
в конструктор class_, так что вы получите
boost::python::class_< A, boost::shared_ptr<A> >("A", boost::python::no_init)
//... .def, etc
;
В general вы не должны передавать общие указатели по ссылке, поскольку, если ссылка на общий указатель недействительна, то ссылка, на которую указывает общий указатель, являетсятакже признан недействительным (поскольку получение ссылки на общий указатель не увеличивает счетчик ссылок на объект, на который указывает указатель).
Совершенно безопасно передавать объекты boost::shared_ptr
вокруг и из Python, счетчики ссылок (Python и shared_ptr) будут правильно управляться, если вы не измените return_value_policy
.Если вы измените политику метода, представленного в python, чтобы он возвращал ссылку на общий указатель, то вы можете вызвать проблемы, так же как передача общих указателей по ссылкам c ++ может вызвать проблемы.
(Кроме того, выследует использовать make_shared<A>(...)
вместо shared_ptr<A>(new A(...))
.)