【发布时间】:2020-01-30 19:39:12
【问题描述】:
我正在研究 pybind11 中的一个测试文件,并遇到了 keep_alive 的不同用法。
py::keep_alive<1, 2>
py::keep_alive<1, 0>
py::keep_alive<0, 1>
有人能解释一下这个测试文件中的这些用法吗?我知道索引0 指的是返回,1 指的是this 指针。我只能理解py::keep_alive<1, 2>(使用文档),但不能理解它在这个测试文件中的用法。
class Child {
public:
Child() { py::print("Allocating child."); }
Child(const Child &) = default;
Child(Child &&) = default;
~Child() { py::print("Releasing child."); }
};
py::class_<Child>(m, "Child")
.def(py::init<>());
class Parent {
public:
Parent() { py::print("Allocating parent."); }
~Parent() { py::print("Releasing parent."); }
void addChild(Child *) { }
Child *returnChild() { return new Child(); }
Child *returnNullChild() { return nullptr; }
};
py::class_<Parent>(m, "Parent")
.def(py::init<>())
.def(py::init([](Child *) { return new Parent(); }), py::keep_alive<1, 2>())
.def("addChild", &Parent::addChild)
.def("addChildKeepAlive", &Parent::addChild, py::keep_alive<1, 2>())
.def("returnChild", &Parent::returnChild)
.def("returnChildKeepAlive", &Parent::returnChild, py::keep_alive<1, 0>())
.def("returnNullChildKeepAliveChild", &Parent::returnNullChild, py::keep_alive<1, 0>())
.def("returnNullChildKeepAliveParent", &Parent::returnNullChild, py::keep_alive<0, 1>());
【问题讨论】: