Puzzling behaviour of Py_IncRef

Tony Flury tony.flury at btinternet.com
Wed Jan 19 09:22:10 EST 2022


On 19/01/2022 11:09, Chris Angelico wrote:
> On Wed, Jan 19, 2022 at 10:00 PM Tony Flury via Python-list
> <python-list at python.org> wrote:
>> Extension function :
>>
>>      static PyObject *_Node_test_ref_count(PyObject *self)
>>      {
>>           printf("\nIncrementing ref count for self - just for the hell
>>      of it\n");
>>           printf("\n before self has a ref count of %ld\n", Py_REFCNT(self));
>>           Py_INCREF(self);
>>           printf("\n after self has a ref count of %ld\n", Py_REFCNT(self));
>>           fflush(stdout);
> At this point, the refcount has indeed been increased.
>
>>           return self;
>>      }
> And then you say "my return value is this object".
>
> The normal thing to do is to add a reference to whatever you're
> returning. For instance, Py_RETURN_NONE will incref None and then
> return it.
>
> So you're incrementing the refcount, then returning it without
> incrementing the refcount. Your code is actually equivalent to "return
> self".
>
> In order to actually leak a reference, you'd need to incref it twice.
>
> ChrisA


Chris - I am still puzzled - does  doing 'return self' automatically 
decrement the ref count of the object ?, and why is that the desired 
behaviour ? Effectively it results in a decrement of two, since at the 
exit of the function the ref count is only 1 (as witnessed by the 
subsequent call to assertEqual).

(I am not suggesting that it should be changed - I understand that would 
be a breaking change !).

You say I am returning it without incrementing, but I am explicitly 
incrementing it before the return.





More information about the Python-list mailing list