| | |
Py_INCREF / Py_DECREF
![]() |
•
•
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 28 Days Ago
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; 28 Days Ago at 4:52 pm.
0
#4 28 Days Ago
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
| Thread Tools | Search this Thread |
address aliased anydbm bash beginner bits calling casino changecolor class clear conversion convert corners count cturtle cursor curves definedlines dictionary digital dynamic dynamically events examples excel external file float format frange function gui handling hints homework i/o iframe import info input java line linux list lists loan loop matching mouse multiple number numbers output parsing path port prime programming projects py py2exe pygame python random rational raw_input recursion recursive scrolledtext searchingfile shebang signal singleton string strings subprocess table tails terminal text thread threading time tkinter tlapse tooltip tuple tutorial type ubuntu unicode urllib urllib2 valueerror variable web-scrape whileloop word wxpython






