boost :: python可以将对象的所有权传递给python回调函数吗?

时间:2016-06-01 17:39:42

标签: python c++ boost boost-python

我目前正在使用boost::python::call函数将C ++指针传递给python回调函数。这样可以正常工作,但如果我以后不删除C ++代码中的指针,我会引入内存泄漏。

我想将指针传递给回调并让python的垃圾收集器处理对象的生命周期。现在,如果我想保存传递给回调的对象,我必须做一个深层复制。

我已经看到here使用return_value_policy<manage_new_object>的包装C ++函数的返回值可以做到这一点。是否可以使用boost::python::call的参数进行类似的操作?

1 个答案:

答案 0 :(得分:4)

manage_new_object的工作方式是成为一个元函数类,它将参数转换为调用者必须负责的转换结果。使用正常的通话政策,它是在引擎盖下使用的。我们必须自己明确地使用该元函数类:

struct Foo {
    X* x = ...;

    void give_up_x(py::object callback) {
        py::manage_new_object::apply<X*>::type wrapper;
        callback(py::handle<>{wrapper(x)});
    }
};

您需要py::handle<>,因为包装器会返回PyObject*而不是py::object。如果您想更直接,可以跳过一些中间类型实例化,只需使用:

void give_up_x(py::object callback) {
    callback(py::handle<>{py::detail::make_owning_holder::execute(x)});
}

我通过猜测和检查发现了上述情况。它看起来至少有效吗?