On 13/02/2014 14:22, Martin Dobias wrote:
On Thu, Feb 13, 2014 at 7:56 PM, Denis Rouzaud <denis.rouz...@gmail.com> wrote:
2) If a SIP wrapper class A has a member class B and an instance of A
is created in Python,  B member is referenced and reference to A is
deleted is it the A instance deleted by GC including B (which is still
referenced)?

C++: class A { B b; }
SIP: class A { B b; }
Python:
a = A()
b = a.b
a = None
# garbage collector

a and b were deleted?
I would say yes too. But, I would ask confirmation to people more aware than
me. There should be some reading this ;)
My understanding is following: with the line "a = None" the reference
count to SIP wrapper of A gets to zero. Because the object is owned by
Python (it was created in Python and the ownership was not transferred
to c++), also the underlying C++ object will be deleted. As far as I
know, "b" will still reference to SIP wrapper of B which in turn
references C++ object that has been deleted in the meanwhile. Using
"b" will may lead to crashes (or just strange behavior). If the class
"B" had a virtual destructor, the SIP wrapper for B (which is subclass
of B) should be at least be notified that the instance is going to be
deleted - so when trying to use "b" again, SIP can at least raise the
exception instead of crashing.

The above is my expectation of what happens, I have not actually tried that.

Martin
_______________________________________________
Qgis-developer mailing list
Qgis-developer@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-developer
I found that a bit surprising, so I did the test, an actually python+sip do a pretty good job in ref counting (at least for the mentioned classes which are pretty simple)

I Added a dtor to QgsSnappingResult to see when it's called:

   ~QgsSnappingResult(){std::cout << __PRETTY_FUNCTION__ << "\n";}


And the little script:

   from qgis.core import *

   print "try to del r while p is still referencing one of it's members"
   r = QgsSnappingResult()
   p = r.snappedVertex
   del r
   print "it's not deleted yet"
   print "delete the referencing guy"
   del p
   print "it's deleted"

   print "try to del r (i.e. without anyone referencing anything)"
   r = QgsSnappingResult()
   del r
   print "it's deleted"


Result:

   try to del r while p is still referencing one of it's members
   it's not deleted yet
   delete the referencing guy
   QgsSnappingResult::~QgsSnappingResult()
   it's deleted
   try to del r (i.e. without anyone referencing anything)
   QgsSnappingResult::~QgsSnappingResult()
   it's deleted





_______________________________________________
Qgis-developer mailing list
Qgis-developer@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-developer

Reply via email to