boost.python公开返回向量的函数

发布于 2024-12-02 05:19:07 字数 469 浏览 0 评论 0 原文

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

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

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

谢谢。

I'm writing an extension module for Python in C++ and I am using boost.python. I want to expose a function that returns a vector<MyClass>. I'm not exactly sure how to do this and how it will interact with Python WRT memory management.

My first thought was to wrap MyClass in shared_ptr, thus the function would return vector<shared_ptr<MyClass>>. Would this help? What happens when shared_ptr<MyClass> instances get to Python land? Will they ever be freed?

So my question is: how can I expose a function that returns a vector of MyClass instances to Python without leaking memory?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

只有影子陪我不离不弃 2024-12-09 05:19:07

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

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

要公开向量列表,请使用索引接口,可以查看这里。

If you use vector<MyClass> those instances in the vector are obviously (kind of, since the vector internally uses dynamically allocated memory) stack allocated. It would be different to vector<MyClass*> which is essentially a vector of dynamically allocated MyClass instances. In this case, a vector<shared_ptr<MyClass> > is the better solution.

Boost Python and smart pointers work well together, which can be seen in this example.

To expose vectors or lists use the indexing interface, which can be viewed here.

第七度阳光i 2024-12-09 05:19:07

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

而(如上所述) Boost.Python 索引套件 工作得很好,让我更喜欢 Boost.Python,我最终重构了这些东西,所以返回的是我的对象的 boost::python::list 。这使得 Python 中的调用代码更加清晰。

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

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

我使用它并且它工作得相当好。

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:

... wrap C++ functions which return a pointer to an object allocated with a new-expression, and expect the caller to take responsibility for deleting that object...

I use this and it works fairly well.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文