LINUX.ORG.RU

[C++][Python][SWIG] сборка мусора и смартпойнтеры?

 , ,


0

2

Есть модуль на С++, к-й через SWIG прицеплен в питон. В питоне создается экземпляр класса С++, к-й передается по указателю в другой класс С++ (например создается граф, работа с графом идет из С++ а наполнение графа из питона).

Дальше начинается кино. Поскольку исходный объект создан в куче и будет прибит сборщиком мусора питон, то пока он в С++ нужен в питоне его надо держать. С другой стороны, если в С++ выяснится что он уже не нужен, то прибить его из С++ не получится, это нужно делать из питона.

Т.е. при создании такого объекта в питоне нужно вызвать из С++ некую порождающую ф-ю, к-я возвращала бы смарт пойнтер или его аналоги, ну в С++ юзать смарты. Теперь внимание, вопрос - как Ъ писать такие вещи, что бы при работе из питона с ними не было проблем? Свиг обычные то указатели уродует довольно прилично (заворачивает черти во что) и доступ к полям и методам класса требует танцев с бубном, а уж во что он смарт пойнтер превратит и подумать страшно... Да и написание порождающей ф-ии не вызывает энтузиазма, все таки я привык что в С++ и питоне код был бол менее похож идеологически похож (во всяком случае я за это борюсь;-)) а тут в С++ вызывать одно, в питоне другое да и писать эти ф-ии как то лень.

Поделитесь опытом;-)

★★★★★

мб лучше в с++ написать метод для заполнения, и его из питона дёргать?

TERRANZ ★★★★
()

Никто и не обещал, что SWIG будет поддерживать всё подмножество C\C++. Естественно сишный код придётся писать с оглядкой на его последующую оборачиваемость.

jcd ★★★★★
()

> С другой стороны, если в С++ выяснится что он уже не нужен, то прибить его из С++ не получится, это нужно делать из питона.

дергай из плюсов питоновскую Py_DECREF() если хочешь прибить питоновский объект

http://docs.python.org/c-api/refcounting.html

anonymous
()
Ответ на: комментарий от anonymous

Для этого мне в плюсах надо знать PyObject* на объект

AIv ★★★★★
() автор топика

Можно поинтересоваться критериями, на основании которых был выбран SWIG? Для С++, по моему скромному разумению, Boost.Python удобнее.

В Boost.python, например, возможно автоматическое заворачивание объекта в «умный» указатель:

class_<A, boost::shared_ptr<A> >("A")
...
;
SSN
()
Ответ на: комментарий от SSN

SWIG парсит С++ код и автоматом тащит все что найдет. В бусте наск я понимаю каждый метод класса надо подключать руками, я для этого слишком ленив (а пользователи тем более). В любом случае, со SWIGом исторически сложилось (и сложилось ИМНО хорошо), и переходить на что то другое просто нерентабельно.

AIv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.