2011-09-01 37 views
3

我正在爲C++編寫Python的擴展模塊,我使用boost.python。我想公開一個返回vector<MyClass>的函數。我不確定如何做到這一點,以及它如何與Python WRT內存管理進行交互。boost.python公開返回向量的函數<MyClass>

我的第一個想法是將MyClass換成shared_ptr,因此函數將返回vector<shared_ptr<MyClass>>。這會有幫助嗎?當shared_ptr<MyClass>實例到達Python土地時會發生什麼?他們會被釋放嗎?

所以我的問題是:我怎樣才能公開一個函數返回vectorMyClass實例Python沒有泄漏內存?

謝謝。

回答

2

如果您使用vector<MyClass>那些vector中的實例顯然(種類,因爲向量在內部使用動態分配的內存)分配了堆棧。這與vector<MyClass*>不同,它實質上是一個動態分配的MyClass實例的向量。在這種情況下,vector<shared_ptr<MyClass> >是更好的解決方案。

Boost Python和智能指針可以很好地協同工作,這可以在this示例中看到。

爲了暴露vector秒或list s使用索引接口,該接口可以被看作here.

0

我跑進更少了同樣的問題:我必須有C++編寫的返回自定義對象的矢量的模塊。

雖然(如上所述)Boost.Python indexing suite工作正常,使我更喜歡Boost.Python,我最終重構了這些東西,因此我返回了一個boost :: python :: list對象。這使得Python中的調用代碼變得更清潔。

至於釋放內存,除了索引套件,也看看manage_new_object返回值的政策:

...包裹C++函數它會返回一個指針與新 - 分配的對象表達,並期望來電者負責刪除該對象...

我使用這個,它工作得很好。