Что означает последний аргумент для 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
?
Ответы
Ответ 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