【问题标题】:boost.python expose function that returns vector<MyClass>boost.python 公开返回 vector<MyClass> 的函数
【发布时间】:2011-09-01 09:34:05
【问题描述】:

我正在用 C++ 为 Python 编写一个扩展模块,并且我正在使用 boost.python。我想公开一个返回vector&lt;MyClass&gt; 的函数。我不确定如何执行此操作以及它将如何与 Python WRT 内存管理交互。

我的第一个想法是将MyClass 包装在shared_ptr 中,因此该函数将返回vector&lt;shared_ptr&lt;MyClass&gt;&gt;。这会有帮助吗?当shared_ptr&lt;MyClass&gt; 实例到达 Python 领域时会发生什么?他们会被释放吗?

所以我的问题是:如何公开一个函数,该函数返回一个 vectorMyClass 实例给 Python 而不会泄漏内存?

谢谢。

【问题讨论】:

    标签: c++ python boost vector shared-ptr


    【解决方案1】:

    如果您使用vector&lt;MyClass&gt;vector 中的那些实例显然是(有点,因为向量内部使用动态分配的内存)堆栈分配。它与vector&lt;MyClass*&gt; 不同,后者本质上是动态分配的MyClass 实例的向量。在这种情况下,vector&lt;shared_ptr&lt;MyClass&gt; &gt; 是更好的解决方案。

    Boost Python 和智能指针可以很好地协同工作,这可以在this 示例中看到。

    暴露vectors或lists使用索引接口,可以查看here.

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题:我必须让一个用 C++ 编写的模块返回一个自定义对象的向量。

        虽然(如上所述)Boost.Python indexing suite 工作得很好,让我更加喜欢 Boost.Python,但我最终重构了这些东西,所以它返回了我的对象的 boost::python::list。这使得 Python 中的调用代码更干净。

        关于释放内存,除了索引套件,还可以看看manage_new_object返回值策略:

        ... 包装 C++ 函数,该函数返回指向分配有 new 表达式的对象的指针,并期望调用者负责删除该对象...

        我用这个,效果还不错。

        【讨论】:

          猜你喜欢
          • 2014-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-02
          • 1970-01-01
          • 2015-01-18
          • 1970-01-01
          • 2015-12-17
          相关资源
          最近更新 更多