c – 提升python对象的生命周期
发布时间:2020-12-16 07:31:35 所属栏目:百科 来源:网络整理
导读:CPP: #include boost/python.hppusing namespace boost;using namespace boost::python;struct Foo{ virtual ~Foo() {} virtual void Print() = 0;};struct FooWrap : Foo,wrapperFoo{ void Print() { this-get_override("Print")(); }};void ProcessFoo(Fo
CPP:
#include <boost/python.hpp> using namespace boost; using namespace boost::python; struct Foo { virtual ~Foo() {} virtual void Print() = 0; }; struct FooWrap : Foo,wrapper<Foo> { void Print() { this->get_override("Print")(); } }; void ProcessFoo(Foo *obj) { obj->Print(); } BOOST_PYTHON_MODULE(hello_ext) { class_<FooWrap,boost::noncopyable>("Foo") .def("Print",pure_virtual(&Foo::Print)); def("ProcessFoo",&ProcessFoo); } Python: import hello_ext class NewFoo(hello_ext.Foo): def Print(self): print 'Print call' hello_ext.ProcessFoo( NewFoo() ) 一切正常,有来自ProcessFoo调用的Print调用文本.但是我希望将所有传递的指针存储到ProcessFoo中: std::vector<Foo*> data; void ProcessFoo(Foo *obj) { data.push_back(obj); obj->Print(); } 退出函数指针后变为无效,我无法从向量中使用它.使指针的生命周期更大的最佳方法是什么?使用共享指针或告诉python不要删除对象(如果它删除它?) 解决方法
如果要存储此指针,则必须增加其底层python对象(PyObject)的引用计数.为此,你必须实现你的void ProcessFoo(Foo * obj)来获取一个python对象而不是C对象,因为否则boost :: python将在你的自适应中为你剥离python对象,你无法再控制它的生命周期.
如果你这样做,你还必须明确地向你转换C类型(但是使用boost :: python这不是那么麻烦). using namespace boost::python; std::vector< std::pair<object,Foo&> > myVec; void ProcessFoo(object o ) { Foo& x = extract<Foo&>(o); // ... do you add to container here,but remember,to add the object o // too,otherwise the refernce counter will be decremented and the object // may go away. myVec.push_back( std::make_pair( o,x ) ); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |