[capi-sig] DECREF when using PyDict_SetItem...
Hrvoje Niksic
hniksic at xemacs.org
Fri Jul 2 12:02:38 CEST 2010
Tim Golden <mail at timgolden.me.uk> writes:
> My understanding is that PyLong_FromLongLong passes its reference
> to my function, which then passes it to PyDict_Set... which INCREFs
> it.
Your understanding is correct.
Note that the same reasoning doesn't apply to, for instance,
PyList_SetItem, which actually "steals" a reference to the value it
receives. Fortunately, functions that behave in this fashion are very
rare, and clearly documented to do so.
> That means, I think, that my function should DECREF it before exit
> since I'm only creating it to store it in the dict. Is that correct?
>
> In other words, should my code really do this?
>
> record_length = PyLong_FromLongLong (usn_record->RecordLength);
> PyDict_SetItemString (dict, "RecordLength", record_length);
> Py_DECREF (record_length)
Yes, and don't forget to check for PyLong_FromLongLong returning NULL:
if (!record_length) {
Py_DECREF(dict); /* presumably */
return NULL;
}
(And of course the same goes for PyDict_SetItemString.)
More information about the capi-sig
mailing list