Открытая функция boost.python, которая возвращает вектор <MyClass> - PullRequest
3 голосов
/ 01 сентября 2011

Я пишу модуль расширения для Python на C ++ и использую boost.python.Я хочу выставить функцию, которая возвращает vector<MyClass>.Я не совсем уверен, как это сделать и как это будет взаимодействовать с управлением памятью Python WRT.

Моей первой мыслью было обернуть MyClass в shared_ptr, поэтому функция вернет vector<shared_ptr<MyClass>>.Это поможет?Что происходит, когда shared_ptr<MyClass> экземпляров попадают на землю Python?Будут ли они когда-нибудь освобождены?

Итак, мой вопрос: как я могу представить функцию, которая возвращает vector из MyClass экземпляров в Python без утечки памяти?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 01 сентября 2011

Если вы используете vector<MyClass>, то эти экземпляры в vector, очевидно, (вид, поскольку вектор внутренне использует динамически выделенную память) выделяются из стека.Это будет отличаться от vector<MyClass*>, который по сути является вектором динамически размещенных MyClass экземпляров.В этом случае vector<shared_ptr<MyClass> > является лучшим решением.

Boost Python и интеллектуальные указатели хорошо работают вместе, что можно увидеть в этом примере.

Чтобы выставитьvector s или list s используют интерфейс индексации, который можно посмотреть здесь .

2 голосов
/ 01 сентября 2011
0 голосов
/ 03 сентября 2011

Я столкнулся с более-менее той же проблемой: у меня должен был быть модуль, написанный на C ++, возвращающий вектор пользовательских объектов.

Хотя (как упомянуто выше) Пакет индексации Boost.Python работал нормально и сделал меня еще более похожим на Boost.Python, в итоге я реорганизовал материал, так что возвращал boost :: python :: список моих объектов вместо. Это сделало код вызова в Python чище.

Что касается освобождения памяти, помимо набора для индексирования, также обратите внимание на manage_new_object политика возвращаемых значений:

... обертывание функций C ++, которые возвращают указатель на объект, выделенный с помощью выражения new, и ожидают, что вызывающая сторона возьмет на себя ответственность за удаление этого объекта ...

Я использую это, и оно работает довольно хорошо.

...