[PyKDE] Re: How do I fix this?
Phil Thompson
phil at river-bank.demon.co.uk
Sun Feb 17 14:42:13 GMT 2002
ian reinhart geiser wrote:
>
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> On Saturday 16 February 2002 05:16 am, Phil Thompson wrote about [PyKDE] Re:
> How do I fix this?:
> > ian reinhart geiser wrote:
> > > -----BEGIN PGP SIGNED MESSAGE-----
> > > Hash: SHA1
> > >
> > > Greetings
> > > I have a situation where I am wrapping a class that handles its instances
> > > internally Basicly when i create a new object as follows:
> > > myObject(parent, name)
> > >
> > > The parent manages the instance and the instance is kept in the parents
> > > internal lookup table. The problem is at the end of the function python
> > > cleans the myObject instance up. Is there a way to keep python from
> > > killing these objects, but still allow me to delete them from C++?
> >
> > Use the /TransferThis/ option on the parent argument. Look at the .sip
> > file for any PyQt class that is derived from QObject.
> >
> > The result is that the generated code transfers ownership (ie.
> > responsibility for calling the dtor) for the new instance to the parent
> > object (so long as the parent object is non-zero).
>
> Ah now I have another problem. It seems when I delete the parent there is a
> race condition between python removeing my object for me and my memory
> cleanup. About 75% of the time python wins and I get QObject double object
> deletion warning, but on the 25% of the time that python loses the object is
> deleted and python has a conniption. Is there a way to force python to just
> deal, and assume I know what i am doing? I have seen talk of this before
> about adding a PY_XINCREF in your sip file for the constructor of the object
> and a PY_XDECREF of the destructor. Is this correct?
Python shouldn't be calling the dtor of the child C++ instances with
/TransferThis/ specified. Or are you saying the race is when deleting
the parent?
Is the parent a different class from the children? Does the parent
derive from QObject? Have you applied /TransferThis/ *everywhere* it is
needed?
Incrementing the reference count in the ctor just means the dtor will
never be called and you've created a memory leak.
Phil
More information about the PyQt
mailing list