Boost.Python: 指针变量的所有权
我正在使用Boost.Python把一个C++的树形类暴露给Python。这个节点类保存了一些子节点,并提供了一个方法
void add_child(Node *node)
这个节点类会负责管理传入的节点指针,当它的析构函数被调用时,会删除它的所有子节点。
我把add_child方法暴露成这样:
.def("addChild", &Node::add_child)
我真正想问的是:我怎么告诉Boost.Python这个节点类会管理子节点的生命周期呢?
因为如果我在Python中执行以下代码:
parentNode = Node()
node = Node()
parentNode.addChild(node)
那么在脚本结束时,node变量引用的对象会被删除两次。第一次是当node变量被删除时,第二次是当parentNode被删除时。
1 个回答
4
我来回答我自己的问题:
我之前在Boost.Python的文档中漏掉了一个常见问题解答,它给了我正确的提示:
//The node class should be held by std::auto_ptr
class_<Node, std::auto_ptr<Node> >("Node")
为add_child方法创建一个简单的包装函数:
void node_add_child(Node& n, std::auto_ptr<Node> child) {
n.add_child(child.get());
child.release();
}
完整的代码,用来暴露节点类:
//The node class should be held by std::auto_ptr
class_<Node, std::auto_ptr<Node> >("Node")
//expose the thin wrapper function as node.add_child()
.def("addChild", &node_add_child)
;