我在这里查看一些示例代码(https://docs.python.org/2.0/api/refcountDetails.html),并试图更好地理解两个示例之间的区别:第一个示例是:
PyObject *t;
t = PyTuple_New(3);
PyTuple_SetItem(t, 0, PyInt_FromLong(1L));
PyTuple_SetItem(t, 1, PyInt_FromLong(2L));
PyTuple_SetItem(t, 2, PyString_FromString("three"));
作者解释说PyTuple_SetItem()会窃取该引用(因此无需对其进行DECREF)。 很好,我明白了。然后,作者使用PySequence_SetItem()呈现了类似的代码,该代码不会窃取引用,因此调用者必须使用DECREF,示例代码如下所示:
PyObject *l, *x;
l = PyList_New(3);
x = PyInt_FromLong(1L);
PySequence_SetItem(l, 0, x); Py_DECREF(x);
x = PyInt_FromLong(2L);
PySequence_SetItem(l, 1, x); Py_DECREF(x);
x = PyString_FromString("three");
PySequence_SetItem(l, 2, x); Py_DECREF(x);
PyObject *l, *x;
我的问题是,如果第二个示例与传递PyTYPE_FromSOMETYPE的第一个示例类似,将会发生什么情况?
PyObject *l;
l = PyList_New(3);
PySequence_SetItem(l, 0, PyInt_FromLong(1L));
PySequence_SetItem(l, 1, PyInt_FromLong(2L));
PySequence_SetItem(l, 2, PyString_FromString("three"));
最后一种情况是良性的,还是会导致内存泄漏(因为PySequence_SetItem不会获得PyInt_FromLong和PyString_FromString创建的引用的所有权,并且调用方也不会对其进行DECREF)?
慕的地6264312
相关分类