可以提升::p ython将对象的所有权传递给python回调函数

Can boost::python pass ownership of an object to a python callback function?

本文关键字:所有权 回调 python 函数 对象 ython      更新时间:2023-10-16

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

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

我在这里看到,这种事情是可能的,带有 return_value_policy<manage_new_object> 的包装C++函数的返回值。是否可以对参数做类似的事情boost::python::call

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)});
}
<小时 />

我通过猜测和检查发现了上述内容。看起来至少有效?