狀態機模式,是在構造高層系統時比較常用的一種設計模式。它的基本思想是,將同一系統的不同狀態對象化,不同狀態的對象分別處理系統在不同狀態下業務問題。以最常用的播放機為例來說,就是將Play,Stop,Pause這些不同的狀態,聲明為class Play,class Stop,class Pause等,然后分別在類內部去處理不同狀態下對按鍵事件的反饋和狀態間的切換等。
有關狀態模式的一個基本實現,網上有較多例子,我就不贅述了,可以參考以下兩篇文件:
Java設計模式中的狀態機:https://www.cnblogs.com/of-fanruice/p/11565679.html C++設計模式中的狀態機:https://blog.csdn.net/fanyun_01/article/details/51791086
我在這里要說的,是在這些實例中忽視的一個重要問題:狀態的資源釋放。
網上幾乎所有的狀態機C++實現,都沒有考慮廢棄狀態的資源釋放問題。當一新狀態產生,直接替換了舊狀態,而未對舊狀態進行處理。這樣的方式,在Java中是沒有問題的,因為Java會在對象沒有調用者時,由虛擬機垃圾回收機制,自動地處理掉廢棄狀態對象。但C++顯然沒有這樣的機制,會造成內存泄漏。所以,對於在C++中使用狀態機模式時,要特別注意處理資源的釋放問題。
可以有兩種解決方法:一、自己建立局部性的垃圾回收機制,用於自動釋放狀態對象;二、利用shared_ptr進行保活和自動釋放。
比較推薦的方法是后者,相對較簡單。當對象切換被調用時,只要是通過share_ptr調用,就可以進行保活,不會導致對象馬上被釋放點,從而避免調用已被釋放的資源。