SWIG_NewPointerObj的最后一个参数是什么意思?

Ada*_*dam 13 python swig

我有一个兼容库,使用SWIG访问C++库.我觉得能够在这个层内创建一个SWIG包装的Python对象是有用的(而不是接受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_DISOWN(我不确定SWIG_NewPointerObj是否接受此)
  • SWIG_POINTER_IMPLICIT_CONV(我不确定SWIG_NewPointerObj是否接受此)

我想创建一个仅在我的包装层中使用的对象.我想用我自己的指向C++对象的指针创建它(所以我可以改变C++对象的值并将它反映在Python对象中.我需要它,所以它可以传递给Python回调函数.我想要在程序的整个生命周期中保留这一个实例,这样我就不会浪费时间为每个回调创建/销毁相同的对象.哪个选项合适,我该怎么办Py_INCREF

Chu*_*Tey 9

使用时创建新的指针对象SWIG_NewPointerObj,可以传递以下标志:

SWIG_POINTER_OWN
SWIG_POINTER_NOSHADOW
Run Code Online (Sandbox Code Playgroud)

如果设置了SWIG_POINTER_OWN,则在Python指针完成时将调用底层C++类的析构函数.默认情况下,不会调用析构函数.请参阅内存管理

对于您的用例,您根本不需要设置任何标志.

从我在源代码中可以看到,如果设置了SWIG_POINTER_NOSHADOW,则返回一个基本的包装指针.您将无法在Python中访问成员变量.你只需要一个不透明的指针.

参考:/usr/share/swig/2.0.7/python/pyrun.swg