c – 提升python对象的生命周期
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c – 提升python对象的生命周期,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1494字,纯文字阅读大概需要3分钟。
内容图文
![c – 提升python对象的生命周期](/upload/InfoBanner/zyjiaocheng/777/4e9ee09e47694b2abf054732ce18516f.jpg)
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 ) );
}
内容总结
以上是互联网集市为您收集整理的c – 提升python对象的生命周期全部内容,希望文章能够帮你解决c – 提升python对象的生命周期所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。