《擴展和嵌入python解釋器》1.10.1 Python中的引用計數

1.10.1 Python中的引用計數

有兩個宏,Py_INCREF(x)Py_DECREF(x), 用來處理增加和減少引用計數。 Py_DECREF(x)也可以在引用計數爲0時釋放對象。爲靈活起見,它卻不直接調用free(),它通過對象中的type object函數指針調用。爲此(也有其他目的),每個對象也都包含指向本身類型對象的指針。

現在,最大的問題是:什麼時候使用Py_INCREF(x)Py_DECREF(x)?讓我們首先介紹一些術語。沒有人’擁有’(own a reference) 一個對象;然而,你可以擁有對象的一個引用。現在,一個對象的引用計數被定義爲一個擁有對它引用的個數。引用的擁有者負責在不在需要引用時調用Py_DECREF(x)。引用關心可以被轉移。有三種方式處理擁有的引用:傳遞它,保存它,或者調用Py_DECREF(x)。忘記處理擁有的引用則產生內存泄漏。

也可以借用 一個對象的引用。引用的借用者不必調用Py_DECREF(),借用者不能保持對象比擁有者還長。借用引用這種用法,在擁有者已經清除引用後,存在使用’已釋放內存’的風險,應完全避免。

借用擁有者的引用的優點是你不必在代碼的任何路徑中關心引用的清除-換句話說,使用借用引用,你就不必冒提前退出時內存泄漏的風險。使用借用防止內存泄漏的缺點是在一些細微的看起來正確的代碼的條件下,

借用引用在擁有者實際已經清除引用後,還能被使用。借用引用通過調用tt class="cfunction">Py_INCREF()能夠被改變成擁有。這不影響擁有者(被借用引用的擁有者)引用的狀態-它創建新的擁有的引用,並給予全部的擁有者的能力(新的擁有者必須正確地清除引用,就象前面的擁有者那樣)。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章