| | |
Py_INCREF / Py_DECREF
Please support our Python advertiser: Programming Forums - DaniWeb Sister Site
![]() |
•
•
Join Date: Oct 2009
Posts: 25
Reputation:
Solved Threads: 0
Hi,
I have a problem because I did not realy get yet when do Py_INCREF or to Py_DECREF.
I build a class type that covers a PyObject*-Array. Now I wrote a function like that:
I don't really know why I should use Py_INCREF(res) but if I don't do it I'll get a segmentation fault after calling the function several times. This doesn't happen if i put in a Py_INCREF(res).
I thought I don't have to care about what the user does with the result. Do I always have to Py_INCREF my results???
I have a problem because I did not realy get yet when do Py_INCREF or to Py_DECREF.
I build a class type that covers a PyObject*-Array. Now I wrote a function like that:
Python Syntax (Toggle Plain Text)
static PyObject * get_first(MyObject *self) { PyObject *res = NULL; if (!self->size) return NULL; res = self->items[0]; // Py_INCREF(res); return res; }
I don't really know why I should use Py_INCREF(res) but if I don't do it I'll get a segmentation fault after calling the function several times. This doesn't happen if i put in a Py_INCREF(res).
I thought I don't have to care about what the user does with the result. Do I always have to Py_INCREF my results???
0
#2 Nov 3rd, 2009
Yes I think that you must always incref the results. Also consider using Py_XINCREF and Py_XDECREF which handle the case where you pass a null pointer.
A good idea is to test your code with the help of the
With this, you can check the refcounts before and after various calls to your C functions.
A good idea is to test your code with the help of the
sys.getrefcount() function. For example python Syntax (Toggle Plain Text)
>>> class A: ... pass ... >>> a = A() >>> sys.getrefcount(a) 2 >>> L =[a, a, a] >>> sys.getrefcount(a) 5
Last edited by Gribouillis; Nov 3rd, 2009 at 4:52 pm.
0
#4 Nov 3rd, 2009
First, you must read this reference counting.
Why do you need to incref results ? First argument, that's how code is usually written. When a function must return None, you write
Second argument: python expects a new reference. If you don't incref, python will decref and you end up with a segfault.
Why do you need to incref results ? First argument, that's how code is usually written. When a function must return None, you write
python Syntax (Toggle Plain Text)
Py_INCREF(Py_None); return Py_None; }
![]() |
Similar Threads
- C++ & embedded Python , Expression Evaluator (Python)
- launching a wxpython gui from matlab (Python)
- C++ ObjectWrapper for Python (Python)
- calling python functions from cpp functions. (Python)
Other Threads in the Python Forum
- Previous Thread: Ceasar Cipher
- Next Thread: Pygame question2
Views: 245 | Replies: 4
| Thread Tools | Search this Thread |
Tag cloud for Python
accessdenied alarm aliased basic beginner casino character code corners cx-freeze definedlines development dictionary digital dynamic editing error events examples excel exe file filename float format ftp function graphics gui handling homework ideas iframe import input java line linux list lists logging loop matching mouse newb number numbers numeric output parameters parsing path port prime program programming progressbar projects py py2exe pygame pyglet pyqt pysimplewizard python random recursion recursive return reverse schedule scrolledtext searchingfile shebang skinning sprite ssh statistics stdout string strings table tails terminal text thread threading time tkinter tlapse tuple tutorial ubuntu unicode urllib urllib2 variable voip windows wxpython






