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

时间:2011-08-28 19:23:47

标签: 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

1 个答案:

答案 0 :(得分:9)

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

SWIG_POINTER_OWN
SWIG_POINTER_NOSHADOW

如果设置了SWIG_POINTER_OWN,则在Python指针完成时将调用底层C ++类的析构函数。默认情况下,不会调用析构函数。见Memory Management

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

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

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