【问题标题】:Boost.Python: Ownership of pointer variablesBoost.Python:指针变量的所有权
【发布时间】:2010-11-06 09:21:02
【问题描述】:

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

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)

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

【问题讨论】:

    标签: c++ python boost boost-python


    【解决方案1】:

    回答我自己的问题:

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

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 1970-01-01
      • 2020-07-28
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      相关资源
      最近更新 更多