【发布时间】:2019-05-23 13:47:33
【问题描述】:
关于我的最后一个问题How to improve Python C Extensions file line reading? 提出了一些我遇到的内存问题。然后,我写了这个简单而荒谬的 Python C Extension 用法,目的只是为了更好地理解 Python Borrowing and Owning References。
static void PyFastFile_dealloc(PyFastFile* self) {
for( PyObject* pyobject : linecache ) {
Py_XDECREF( pyobject );
}
Py_TYPE(self)->tp_free( (PyObject*) self );
}
static PyObject* PyFastFile_tp_iter(PyFastFile* self, PyObject* args) {
counter = 10;
std::string line{"sample line"}
PyObject* obj = PyUnicode_DecodeUTF8( line.c_str(), line.size(), "replace" );
linecache.push_back( obj );
}
static PyObject* PyFastFile_iternext(PyFastFile* self, PyObject* args) {
--counter;
if( !( counter ) ) {
PyErr_SetNone( PyExc_StopIteration );
return NULL;
}
PyObject* retval = linecache[0];
Py_XINCREF( retval );
return retval;
}
// create the module
PyMODINIT_FUNC PyInit_fastfilepackage(void) {
PyFastFileType.tp_iter = (getiterfunc) PyFastFile_tp_iter;
PyFastFileType.tp_iternext = (iternextfunc) PyFastFile_iternext;
PyFastFileType.tp_dealloc = (destructor) PyFastFile_dealloc;
...
}
在这种情况下,
-
tp_next()是否返回了对linecache[0]的拥有引用,因为它正在递增其Py_XINCREF? - 意思是,我的
linecache[0]缓存现在是借来的引用吗? - 由于
tp_next()被多次调用,并且我多次返回相同的指针以增加其Py_XINCREF,这会导致双/三/数次释放吗? -
tp_next()返回对象是否只有一个拥有的引用,这将导致双重/三重/多个?
相关:
【问题讨论】:
-
你想要c++答案吗?
shared_ptr也许。
标签: python python-c-api