On Friday 23 January 2009 04:44:43 Sebastian Walter wrote: > > In the code you posted this time, incref() is required so that someone > > owns a reference to the array object. What I don't know off the top of my > > head is whether you need an incref in the constructor of A and a decref > > in the destructor of A. > > This is also something I wondered about. > I guess it's better incref/decref them to be on the save side, right?
IIRC, PyArray_SimpleNewFromData gives you a new reference. If that is correct, you will need to decref() it in the destructor of A so that python can clean up the numpy array (without touching your global data). What is the value of the flag NPY_OWNDATA after the call to PyArray_SimpleNewFromData? That should tell you whether python will attempt to free your global data structure. > ------------------- test.py ---------------- > from _test import * > import sys > > def test_my_array(): > a = A() > print 'a.my_array=',a.my_array > print 'sys.getrefcount(a)=',sys.getrefcount(a) > print 'sys.getrefcount(a.my_array)=',sys.getrefcount(a.my_array) > > > if __name__ == "__main__": > test_my_array() > > ------------ end test.py ------------- > I get the output > > ----------- output ------------- > > wal...@wronski$ python test.py > a.my_array= [ 1. 2. 3.] > sys.getrefcount(a)= 2 > sys.getrefcount(a.my_array)= 2 > > ----------- end output -------- > > Ermm, is that good? > I expected that the refcount would be 1 and not 2. I don't know. I generally avoid these issues by writing custom converters and letting boost.python handle reference counting. Perhaps someone else on the list might be able to help. Regards, Ravi _______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig