Подтвердить что ты не робот

Что означает последний аргумент для SWIG_NewPointerObj?

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

Я обнаружил, что функция 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_DISOWN (я не уверен, что SWIG_NewPointerObj принимает это)
  • SWIG_POINTER_IMPLICIT_CONV (я не уверен, что SWIG_NewPointerObj принимает это)

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

4b9b3361

Ответ 1

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

SWIG_POINTER_OWN
SWIG_POINTER_NOSHADOW

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

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

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

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