擅长:python、mysql、java
<p>使用PyInt_FromLong()创建并添加到列表中的对象应保存在局部变量中。</p>
<p>原因是<a href="http://docs.python.org/extending/extending.html#ownership-rules" rel="noreferrer">ownership rules</a>:PyInt_FromLong()生成您自己的引用。在对PyTuple_SetItem()的调用中,您再次失去了这个所有权,因为PyTuple_SetItem()从您“窃取”了它,所以您不必在意。但是PyList_Append()没有这样做,它增加了refcount。为了正确地对对象进行GC,您必须通过递减来释放您的所有权。</p>
<p>因此,您可以执行以下操作,而不是PyList_Append(item,PyInt_FromLong(jp)):</p>
<pre><code>PyObject * jpo = PyInt_FromLong(jp);
// do some error checking here
PyList_Append(item, jpo);
Py_DECREF(jpo);
</code></pre>
<p>这将使程序做正确的事情。</p>