我正在用C ++编写Python扩展模块,我正在使用boost.python。我想公开一个返回vector<MyClass>
的函数。我不确定如何做到这一点以及它将如何与Python WRT内存管理进行交互。
我的第一个想法是将MyClass
包裹在shared_ptr
中,因此该函数将返回vector<shared_ptr<MyClass>>
。这会有帮助吗?当shared_ptr<MyClass>
个实例到达Python域时会发生什么?他们会被释放吗?
所以我的问题是:如何在不泄漏内存的情况下向Python返回一个vector
个MyClass
个实例的函数?
感谢。
答案 0 :(得分:2)
答案 1 :(得分:2)
如果您使用vector<MyClass>
vector
中的那些实例显然(由于向量内部使用动态分配的内存,那么)已分配堆栈。它与vector<MyClass*>
不同,它基本上是动态分配的MyClass
实例的向量。在这种情况下,vector<shared_ptr<MyClass> >
是更好的解决方案。
Boost Python和智能指针可以很好地协同工作,这可以在this示例中看到。
要公开vector
或list
,请使用索引界面,可以查看here.
答案 2 :(得分:0)
我遇到了更多相同的问题:我必须使用C ++编写的模块返回自定义对象的向量。
虽然(如上所述)Boost.Python indexing suite工作得很好并且让我更喜欢Boost.Python,但我最终重构了这些东西,所以这就是返回我的对象的boost :: python :: list。这使得Python中的调用代码更加清晰。
关于释放内存,除索引套件外,还要查看manage_new_object返回值策略:
...包装C ++函数,它返回指向使用new-expression分配的对象的指针,并期望调用者负责删除该对象......
我使用它并且效果很好。