что означает последний аргумент SWIG_NewPointerObj? - PullRequest
13 голосов
/ 28 августа 2011

У меня есть библиотека совместимости, которая использует SWIG для доступа к библиотеке C ++.Мне было бы полезно иметь возможность создавать объект Python в SWIG-оболочке внутри этого слоя (в отличие от принятия объекта C ++ в качестве аргумента или его возврата).Т.е. я хочу PyObject*, который указывает на обернутый SWIG объект C ++.

Я обнаружил, что функция SWIG_NewPointerObj делает именно это.Сгенерированный SWIG файл xx_wrap.cpp использует эту функцию, но он также доступен в заголовке, выданном swig -python -external-runtime swigpyrun.h

ОДНАКО, я не могу найти ссылку на последний аргумент этой функции.Похоже, что он определяет право собственности на объект, но нет документации, в которой говорится, что означает каждый из параметров (или даже то, что они все).Кажется, что следующие допустимые значения:

  • 0
  • SWIG_POINTER_OWN
  • SWIG_POINTER_NOSHADOW
  • SWIG_POINTER_NEW = OWN + NOSHADOW
  • SWIG_POINTER_IMPLICIT_CONV (я не уверен, что SWIG_NewPointerObj принимает это)

я хочу создать только объект, который используетсямой упаковочный слой.Я хочу создать его из моего собственного указателя на объект C ++ (чтобы я мог изменить значение объекта C ++ и отразить его в объекте Python. Мне нужно, чтобы он мог быть передан в функцию обратного вызова Python. Я хочусохраняйте этот экземпляр на протяжении всей жизни программы, чтобы не тратить время на создание / уничтожение идентичных объектов для каждого обратного вызова. Какой вариант подходит и что мне делать Py_INCREF?

1 Ответ

9 голосов
/ 25 августа 2012

Когда вы создаете новые объекты указателя с SWIG_NewPointerObj, вы можете передавать следующие флаги:

SWIG_POINTER_OWN
SWIG_POINTER_NOSHADOW

Если установлено SWIG_POINTER_OWN, деструктор базового класса C ++ будет вызван, когда указатель Python будет завершен. По умолчанию деструктор вызываться не будет. См. Управление памятью

Для вашего случая использования вам вообще не нужно устанавливать какие-либо флаги.

Из того, что я вижу в источниках, если SWIG_POINTER_NOSHADOW установлен, тогда возвращается простой обернутый указатель. Вы не сможете получить доступ к переменным-членам в Python. Все, что у вас будет, это непрозрачный указатель.

Ссылка: /usr/share/swig/2.0.7/python/pyrun.swg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...