【发布时间】:2021-06-02 03:24:53
【问题描述】:
使用 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, "List")
.def("append", &List::append, py::keep_alive<1, 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 逆向的解决方案?
提前致谢!
将 C++17 与 pybind11 v2.6.1 结合使用。
【问题讨论】: