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

发布于 2024-10-01 02:23:55 字数 486 浏览 4 评论 0原文

我正在使用 Boost.Python 将 C++ 树类公开给 python。 Node 类保存子节点列表并提供一个方法

void add_child(Node *node)

Node 类获得所提供的 Node 指针的所有权,并在调用析构函数时删除其子节点。

我将 add_child 方法公开为:

.def("addChild", &Node::add_child)

我的实际问题是:我如何告诉 Boost.Python Node 类拥有子节点的所有权?

因为如果我在 python 中执行以下代码:

parentNode = Node()
node = Node()
parentNode.addChild(node)

节点变量引用的对象在脚本末尾被删除两次。一次是当节点变量被删除时,第二次是当父节点被删除时。

I'm exposing a C++ tree class using Boost.Python to python. The node class holds a list of child nodes and provides a method

void add_child(Node *node)

The Node class takes ownership of the provided Node pointer and deletes it's child nodes when the destuctor gets called.

I'm exposing the add_child method as:

.def("addChild", &Node::add_child)

My actual question is: How do i tell Boost.Python that the Node class takes ownership of the child nodes?

Because if i execute the following code in python:

parentNode = Node()
node = Node()
parentNode.addChild(node)

the object referenced by the node variable gets deleted twice at the end of the script. Once when the node variable gets deleted and a second time when the parentNode gets deleted.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

李不 2024-10-08 02:23:55

回答我自己的问题:

我错过了 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)
;

Answering my own question:

I've missed an FAQ entry in the Boost.Python documentation that gave me the right hint:

//The node class should be held by std::auto_ptr
class_<Node, std::auto_ptr<Node> >("Node")

Create a thin wrapper function for the add_child method:

void node_add_child(Node& n, std::auto_ptr<Node> child) {
   n.add_child(child.get());
   child.release();
}

Complete code to expose the node class:

//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)
;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文