[PyQt] Custom exception when transferring "owned" object

Nyall Dawson nyall.dawson at gmail.com
Fri Mar 29 06:32:07 GMT 2019

Hi list,

I'm trying to find a way to raise a custom exception if someone
attempts to call a method which takes ownership with an object which
is already owned elsewhere (instead of crashing at some future

Here's what I've got so far:


bool addGeometry( QgsAbstractGeometry *g );


    PyObject *obj = sipConvertFromType( a0, sipType_QgsAbstractGeometry, NULL );
    if ( !sipIsPyOwned( ( sipSimpleWrapper * )obj ) )
      PyErr_SetString( sipException_OwnershipException, "Geometry is
already owned by another c++ object. Use .clone() to add a deep copy
of the geometry to this multipoint." );
      sipIsErr = 1;
      Py_DECREF( obj );
      bool res = sipCpp->addGeometry( a0 );
      if ( res )
        PyObject *owner = sipConvertFromType( sipCpp,
sipType_QgsAbstractGeometry, NULL );
        sipTransferTo( obj,  owner );
      return PyBool_FromLong( res );

It works ok about 50% of the time, the other 50% it crashes. I suspect
my methodcode isn't correct transferring ownership and the argument
c++ object is getting deleted when its Python wrapper goes out of

Can anyone see what I'm missing here?


More information about the PyQt mailing list