資料模型上的Python參考指出
使用“try...except”陳述句捕獲例外可能會使物件保持活動狀態。
例外改變控制流似乎很明顯,可能導致不同的物件仍然被參考。為什么明確提到它?這里是否存在記憶體泄漏的可能性?
uj5u.com熱心網友回復:
例外存盤回溯,存盤之間的所有子幀(“函式呼叫”)籌集和除外。框架參考所有本地名稱及其值,防止對本地名稱和值進行垃圾收集。
這意味著例外處理程式應及時完成處理例外以允許清理子本地人。盡管如此,一個函式不能依賴于它的區域變數在函式結束后立即被收集。
因此,即使在參考計數實作中,諸如RAII 之類的模式也不可靠。當需要及時清理時,物件應該提供顯式清理(用于finally塊)或最好是自動清理(用于with塊)的方法。
物件、值和型別
[…] 強烈建議程式明確關閉此類物件。'
try...finally' 陳述句和 'with' 陳述句提供了方便的方法來做到這一點。
可以用一個標記它何時被垃圾收集的類來觀察這一點。
class Collectible:
def __init__(self, name):
self.name = name
def __del__(self, print=print):
print("Collecting", self.name)
def inner():
local_name = Collectible("inner local value")
raise RuntimeError("This is a drill")
def outer():
local_name = Collectible("outer local value")
inner()
try:
outer()
except RuntimeError as e:
print(f"handling a {type(e).__name__}: {e}")
在 CPython 上,輸出顯示處理程式在收集本地變數之前運行:
handling a RuntimeError: This is a drill
Collecting inner local value
Collecting outer local value
請注意,CPython 使用參考計數,這已經導致盡快進行快速清理。其他實作可能會進一步任意延遲清理。
uj5u.com熱心網友回復:
好吧,AFAIK,如果例外參考某個物件或另一個物件,則在例外本身被收集之前不會收集這些物件,而且,如果except陳述句碰巧參考了某個物件,那也會在塊結束之前發布其集合. 我想知道是否還有其他不太明顯的方法可以捕獲例外會影響垃圾收集。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/374238.html
下一篇:在選擇選項標簽中使用三元運算子
