问题描述
可以使用 pybind11::keep_alive 构造确保附加到 List 的对象至少与 List 本身一样长。
引用 pybind11::keep_alive 的文档,
考虑以下示例:此处,列表追加操作的绑定代码将新添加元素的生命周期与底层容器联系起来:
py::class_<List>(m,"List")
.def("append",&List::append,py::keep_alive<1,2>());
同样,如何在 remove API 上解开附加对象的生命周期?
py::class_<List>(m,2>())
.def("remove",&List::remove,... /* What goes here? */);
澄清一下,remove
API 将要移除的元素作为参数并从列表中移除该元素。因此,在删除成功后将被删除对象的生命周期与 List 绑定是没有意义的。
以下方法可以像这样减少 python 对象上的引用计数
.def("remove",[](List& list,py::object obj) {
list.remove(obj.cast<CppObject*>());
obj.dec_ref();
});
不起作用,因为当 List python 对象被垃圾收集时,pybind11 将尝试再次减少引用计数。
是否有与 pybind11::keep_alive 反向的解决方案?
提前致谢!
在 pybind11 v2.6.1 中使用 C++17。
解决方法
浏览 pybind11 问题后,我发现以下功能请求 https://github.com/pybind/pybind11/issues/1708 来解决与我所描述的问题类似的问题。