boost.python公开返回向量的函数
我正在用 C++ 编写 Python 扩展模块,并且使用 boost.python。我想公开一个返回 vector
的函数。我不太确定如何执行此操作以及它将如何与 Python WRT 内存管理交互。
我的第一个想法是将 MyClass
包装在 shared_ptr
中,因此该函数将返回 vector
。这有帮助吗?当 shared_ptr
实例到达 Python 空间时会发生什么?他们会被释放吗?
所以我的问题是:如何在不泄漏内存的情况下向 Python 公开一个返回 MyClass
实例的 vector
的函数?
谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您使用 > 是更好的解决方案。
vector
,vector
中的那些实例显然是(有点,因为矢量内部使用动态分配的内存)堆栈分配的。它与vector
不同,后者本质上是动态分配的MyClass
实例的向量。在这种情况下,向量Boost Python 和智能指针可以很好地协同工作,这一点可以在这个示例中看到。
要公开
向量
或列表
,请使用索引接口,可以查看这里。If you use
vector<MyClass>
those instances in thevector
are obviously (kind of, since the vector internally uses dynamically allocated memory) stack allocated. It would be different tovector<MyClass*>
which is essentially a vector of dynamically allocatedMyClass
instances. In this case, avector<shared_ptr<MyClass> >
is the better solution.Boost Python and smart pointers work well together, which can be seen in this example.
To expose
vector
s orlist
s use the indexing interface, which can be viewed here.看看 Boost.Python 的索引套件。
Take a look at Boost.Python's indexing suite.
我遇到了同样的问题:我必须有一个用 C++ 编写的模块,返回自定义对象的向量。
而(如上所述) Boost.Python 索引套件 工作得很好,让我更喜欢 Boost.Python,我最终重构了这些东西,所以返回的是我的对象的 boost::python::list 。这使得 Python 中的调用代码更加清晰。
关于释放内存,除了索引套件之外,还可以查看 manage_new_object 返回值策略:
我使用它并且它工作得相当好。
I ran into more-less the same problem: I had to have a module written in C++ returning a vector of custom objects.
While (as mentioned above) Boost.Python indexing suite worked fine and made me like Boost.Python even more, I ended up refactoring the stuff, so that was returning a boost::python::list of my objects instead. This made the invocation code in Python cleaner.
With regards to freeing the memory, besides the indexing suite, also have a look at manage_new_object return value policy:
I use this and it works fairly well.