我想知道如何在不创建引用计数灾难的情况下使用PyDict_SetDefault
。
文档没有说明被盗参考资料,有些测试表明它没有窃取参考文献" gpg2 --gen-key
。但是,只有当密钥没有出现在字典中时,它才会增加
这对我来说似乎很复杂,因为它太容易出错了。我目前正在使用它:
default
最后,字典和我拥有item = PyDict_SetDefault(dictionary, key, defaultvalue);
if (item != defaultvalue) {
/* key was present, the item is a borrowed reference and default is at refcount 1.*/
Py_INCREF(item); /* item at refcount 2 */
Py_DECREF(defaultvalue); /* default at refcount 0 */
defaultvalue= NULL;
} else {
/* key wasn't present, item is default and has refcount 2. */
defaultvalue = NULL;
}
和item
的引用被彻底删除了,对吗?
有没有更好的方法来处理这种情况,而没有明确检查我错过了default
?是真的那么复杂还是我错过了明显而简单的方式?
答案 0 :(得分:1)
item = PyDict_SetDefault(dictionary, key, defaultvalue);
Py_INCREF(item);
Py_DECREF(defaultvalue);
item==defaultvalue
是否真的无关紧要 - 无论发生什么事,你都拥有item
的所有权(通过增加它)并释放defaultvalue
的所有权(通过减少它,假设你没有'我想把它用于其他任何事情。)
如果字典中存在key
,则不使用defaultvalue
,因此其引用计数保持为1,并且会因为减压而被销毁。引用item
时引用的引用数为1(因为它存储在字典中),我们将其递增,因为我们也使用它,因此item
现在的引用数为2。
如果key
不存在,那么defaultvalue
将存储在字典中(现在引用refcount 2)并使用并返回。 item
和defaultvalue
是相同的。我们递增item
(引用3)递减defaultvalue
(refcount 2)。
无论哪种方式,我们都会在同一个地方结束。