boost.python 暴露返回 vector<MyClass> 的函数

3 投票
3 回答
2789 浏览
提问于 2025-04-17 01:03

我正在用C++为Python写一个扩展模块,并且我使用了boost.python库。我想要暴露一个函数,这个函数返回一个vector<MyClass>。不过我不太确定该怎么做,以及这在内存管理方面会和Python有什么关系。

我最初的想法是把MyClass包装在shared_ptr里,这样函数就会返回vector<shared_ptr<MyClass>>。这样做有帮助吗?当shared_ptr<MyClass>实例到达Python时会发生什么?它们会被释放吗?

所以我的问题是:我该如何暴露一个返回MyClass实例的vector的函数给Python,而不造成内存泄漏呢?

谢谢。

3 个回答

0

我遇到了差不多一样的问题:我需要一个用C++写的模块,返回一个自定义对象的列表。

虽然之前提到的 Boost.Python索引工具运行得很好,让我对Boost.Python更加喜欢,但最后我还是对代码进行了重构,让它返回一个boost::python::list类型的对象列表。这样在Python中的调用代码就更简洁了。

关于内存释放,除了索引工具外,还可以看看 manage_new_object 的返回值策略:

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

我使用这个方法,效果相当不错。

2

看看 Boost.Python索引工具

2

如果你使用 vector<MyClass>,那么这个 vector 里的实例其实是存放在栈上的(虽然因为 vector 内部使用了动态分配的内存,所以有点复杂)。而如果你使用 vector<MyClass*>,那就是一个存放动态分配的 MyClass 实例的向量。在这种情况下,使用 vector<shared_ptr<MyClass> > 会更好。

Boost Python 和智能指针配合得很好,这在 这个例子中可以看到。

要暴露 vectorlist,可以使用索引接口,具体可以查看 这里。

撰写回答