在看 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]:
nsCOMPtr<nsIWidget> kungFuDeathGrip(this);
1
nsCOMPtr<nsIWidget> kungFuDeathGrip(this);
可以看到
kungFuDeathGrip 通常都是指向 this,但是隨著 gecko 越來越複雜,也有許多的
kungFuDeathGrip 被用來指向其他的物件。
畢竟
kungFuDeathGrip 並不是一個完美的解法,而且對於 gecko 的初學者來說會造成理解上的困擾。所以在 bug 329937 內有人嘗試著想要根除
kungFuDeathGrip ,但是這還是有一定的困難度,畢竟根本的問題還是我們無法確切掌握物件被刪除的時機 ,所以短期內
kungFuDeathGrip 還是有其存在的必要性。
Reference