增强python对象生命周期

2024-03-29 13:41:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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:

^{pr2}$

一切正常,来自ProcessFoo调用的Print call文本。但我想存储所有传递到ProcessFoo的指针,如:

std::vector<Foo*> data;
void ProcessFoo(Foo *obj) { data.push_back(obj); obj->Print(); }

退出函数后指针变得无效,我不能从向量使用它。什么是使指针的寿命变大的最佳方法?使用共享指针或告诉python不要删除对象(如果它删除了它?)在


Tags: objdatafoodefvirtualnamespacecppstruct
1条回答
网友
1楼 · 发布于 2024-03-29 13:41:43

如果要存储这个指针,就必须增加底层python对象(PyObject)的引用计数。为此,您必须实现您的空进程Foo(FoO*Objo)以获得Python对象而不是C++对象,因为否则Boosix::Python将在其适配中为Python对象剥离,并且不再控制其生存期。在

如果你这样做,你也必须做明确的转换到C++类型(但是用Booo::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 ) );
}

相关问题 更多 >