Gecko 內的死亡之握-kungFuDeathGrip

在看 gecko 的 code 時無意間發現了這個神奇的區域變數: kungFuDeathGrip ,乍看之下這個奇怪的區域變數在 function 內就只有被宣告,並且沒有被使用到,那麼到底為什麼要有這個變數的存在呢?為了更進一步了解這個變數的由來,我們先來看看  kungFuDeathGrip  字面上的意義,直接翻譯成中文的話就是:功夫死亡之握,下圖有更為生動地表示。

Death grip

死亡之握到底要握住什麼東西呢?在 gecko 的 code 搜尋 [1] 可以發現有許多地方都出現了  kungFuDeathGrip  變數,而且型別都是 smart pointer,例如: nsCOMPtr  或是 nsRefPtr 。在 gecko 內幾乎所有的物件都是由 smart pointer 來管理的,關於smart pointer 的說明可以參照之前 online casino kk1fff 的文章 [2]。簡單來說,smart pointer 所帶來的好處是當物件不再被使用到時,記憶體可以被自動的回收。由於常常會有多個物件共用同一個 smart pointer,所衍生出來的問題就是我們無法確切地掌握物件被刪除的時機點。在某些特殊的情況下,我們要確保某物件在特定的時間內必須要活著,不能被刪除。簡單的做法就是在 function 內多宣告一個 smart pointer 變數,並且指向該物件,其目的是為了增加 reference count ,當離開 function 的 scope 後, kungFuDeathGrip  變數會被刪除,也不會影響到原本的 reference count。雖然  kungFuDeathGrip  變數在 function 內並沒有被使用到,但是藉由這個做法,可以保證該物件在這個 function 的範圍內不會被刪除。

kungFuDeathGrip  較為常見的用法如下 [3]:

可以看到  kungFuDeathGrip  通常都是指向 this,但是隨著 gecko 越來越複雜,也有許多的  kungFuDeathGrip  被用來指向其他的物件。

畢竟  kungFuDeathGrip  並不是一個完美的解法,而且對於 gecko 的初學者來說會造成理解上的困擾。所以在 bug 329937 內有人嘗試著想要根除 kungFuDeathGrip ,但是這還是有一定的困難度,畢竟根本的問題還是我們無法確切掌握物件被刪除的時機 ,所以短期內  kungFuDeathGrip  還是有其存在的必要性。

Reference

您可能也會喜歡

目前找不到相關文章

對此文章發表回應

你的電子郵件位址並不會被公開。 必要欄位標記為 *