我想知道当一个新的值被设置到PyDict(在一个C扩展中)的现有字段中时,内存管理/引用计数是如何工作的。在
例如,假设按以下方式创建和填充字典:
myPyDict = PyDict_New();
tempPyObj = PyString_FromString("Original Value");
PyDict_SetItemString(myPyDict,"fieldname",tempPyObj);
Py_DECREF(tempPyObj);
从内存和引用计数的角度来看,如果
^{pr2}$原始值的参考计数是否自动递减(内存自动释放)?在
PyList_SetItem
的文档特别提到了列表的情况:This function “steals” a reference to item and discards a reference to an item already in the list at the affected position.
但是PyDic_SetItem
和{
旧值的ref计数由
PyList_SetItem
函数的逻辑自动递减。 你不应该一个人减少旧的价值。在如果您想了解详细信息,请查看CPython源代码,特别是
Objects/dictobject.c
文件。在1)第
PyDict_SetItemString()
https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L3250-L3262
它是一个薄薄的包裹物
PyDict_SetItem()
2)第
PyDict_SetItem()
https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L1537-L1565
它仍然非常简单,而且很明显,与插入/替换dict中的值相关的所有繁重工作实际上都是由
insertdict()
完成的。在3)第
insertdict()
https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L1097-L1186
是给我们答案的函数。在此函数中,您可以找到关键代码,尤其是调用:
它减少旧值的ref计数。在
相关问题 更多 >
编程相关推荐