boost.python公开返回vector <myclass> </myclass>的函数

时间:2011-09-01 09:34:06

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

我正在用C ++编写Python扩展模块,我正在使用boost.python。我想公开一个返回vector<MyClass>的函数。我不确定如何做到这一点以及它将如何与Python WRT内存管理进行交互。

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

所以我的问题是:如何在不泄漏内存的情况下向Python返回一个vectorMyClass个实例的函数?

感谢。

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

如果您使用vector<MyClass> vector中的那些实例显然(由于向量内部使用动态分配的内存,那么)已分配堆栈。它与vector<MyClass*>不同,它基本上是动态分配的MyClass实例的向量。在这种情况下,vector<shared_ptr<MyClass> >是更好的解决方案。

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

要公开vectorlist,请使用索引界面,可以查看here.

答案 2 :(得分:0)

我遇到了更多相同的问题:我必须使用C ++编写的模块返回自定义对象的向量。

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

关于释放内存,除索引套件外,还要查看manage_new_object返回值策略:

  

...包装C ++函数,它返回指向使用new-expression分配的对象的指针,并期望调用者负责删除该对象......

我使用它并且效果很好。