可以提升::p ython将对象的所有权传递给python回调函数
Can boost::python pass ownership of an object to a python callback function?
我目前正在使用 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)});
}
<小时 />我通过猜测和检查发现了上述内容。看起来至少有效?
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 访问类C++ C 样式回调
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- UI自动化回调中com对象的所有权
- 可以提升::p ython将对象的所有权传递给python回调函数