Boost.Python: Ownership of pointer variables

2019-05-12 13:40发布

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.

1条回答
We Are One
2楼-- · 2019-05-12 14:23

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)
;
查看更多
登录 后发表回答