Boost.Python: 指针变量的所有权

3 投票
1 回答
1186 浏览
提问于 2025-04-16 06:39

我正在使用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)
;

撰写回答