我如何让boost.python调用一个函数来释放一个对象?

时间:2014-02-06 16:54:06

标签: python c++ boost boost-python

我有一个C ++函数Obj *new_object(const char *name)。它返回一个从私有池分配的新对象。该对象应该由free_object(Obj *obj)释放(而不是由free()或delete)。如何安排我的boost.python包装器,以便当python obj超出范围(并调用gc)时,将调用free_obj

1 个答案:

答案 0 :(得分:3)

我认为最方便的方法是确保你的Boost.Python类声明包含Objboost::shared_ptr<Obj>

然后,使用boost::python::make_constructor在构造时实例化对象。您返回的boost::shared_ptr<Obj>应该设置自己的析构函数(在您的情况下,free_object())。以下是该解决方案的草图:

static boost::shared_ptr<Obj> init_from_c_string(const char* name) {
  //set destructor upon shared pointer initialisation
  return boost::shared_ptr<Obj>(new_object(name), &free_object);
}

//at your module scope, declare "Obj" like this
using namespace boost::python;
class_<Obj, boost::shared_ptr<Obj>>("Obj", "Obj docstring", no_init)
    .def("__init__", make_constructor(&init_from_c_string, default_call_policies(), (arg("name"))), "Constructs a new object with a given name.")
    //other .def and similar
;