我目前正在使用boost::python::call
函数将C ++指针传递给python回调函数。这样可以正常工作,但如果我以后不删除C ++代码中的指针,我会引入内存泄漏。
我想将指针传递给回调并让python的垃圾收集器处理对象的生命周期。现在,如果我想保存传递给回调的对象,我必须做一个深层复制。
我已经看到here使用return_value_policy<manage_new_object>
的包装C ++函数的返回值可以做到这一点。是否可以使用boost::python::call
的参数进行类似的操作?
答案 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)});
}
我通过猜测和检查发现了上述情况。它看起来至少有效吗?