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

Reply via email to