原文:
raii技術被認為是c++中管理資源的最佳方法,進一步引申,使用raii技術也可以實現安全、簡潔的狀態管理,編寫出優雅的異常安全的**。
raii是c++的發明者bjarne stroustrup提出的概念,raii全稱是「resource acquisition is initialization」,直譯過來是「資源獲取即初始化」,也就是說在建構函式中申請分配資源,在析構函式中釋放資源。
利用物件生命週期來控制程式資源(如記憶體、檔案控制代碼、網路連線、互斥量等等)的技術,因為c++的語言機制保證了,當乙個物件建立的時候,自動呼叫建構函式,當物件超出作用域的時候會自動呼叫析構函式。所以,在raii的指導下,我們應該使用類來管理資源,將資源和物件的生命週期繫結。
智慧型指標(std::shared_ptr和std::unique_ptr)即raii最具代表的實現,使用智慧型指標,可以實現自動的記憶體管理,再也不需要擔心忘記delete造成的記憶體洩漏。毫不誇張的來講,有了智慧型指標,**中幾乎不需要再出現delete了。
記憶體只是資源的一種,在這裡我們討論一下更加廣義的資源管理。比如說檔案的開啟與關閉、windows中控制代碼的獲取與釋放、對資料庫的訪問、斷開資料庫連線等等。
按照常規的raii技術需要寫一堆管理它們的類,有的時候顯得比較麻煩。但是如果手動釋放,通常還要考慮各種異常處理。文章 介紹乙個實現的比較簡潔的方法,使用了c++11標準中的lambda表示式和std::function相結合的方法,非常簡潔、明了(待總結)。
std::mutex mutex_;
void function()
因為,在互斥量lock和unlock之間的**很可能會出現異常,或者有return語句,這樣的話,互斥量就不會正確的unlock,會導致執行緒的死鎖。所以正確的方式是使用std::unique_lock或者std::lock_guard對互斥量進行狀態管理:
std::mutex mutex_;
void function()
在建立std::lock_guard物件的時候,會對std::mutex物件進行lock,當std::lock_guard物件在超出作用域時,會自動std::mutex物件進行解鎖,這樣的話,就不用擔心**異常造成的執行緒死鎖。
通過上面的分析可以看出,raii的核心思想是將資源或者狀態與物件的生命週期繫結,通過c++的語言機制,實現資源和狀態的安全管理。理解和使用raii能使軟體設計更清晰,**更健壯。
C 之RAII技術解析
1.什麼是raii 技術?我們在c 中經常使用new申請了記憶體空間,但是卻也經常忘記delete 申請的空間,容易造成記憶體溢位,於是raii技術就誕生了,來解決這樣的問題。raii resource acquisition is initialization 機制是bjarne stroustr...
C 資源管理之 RAII
raii,它是 r esource acquisition is initialization 的首字母縮寫。也稱為 資源獲取就是初始化 是c 等程式語言常用的管理資源 避免記憶體洩露的方法。它保證在任何情況下,使用物件時先構造物件,最後析構物件。raii的好處在於它提供了一種資源自動管理的方式,當...
狀態機之C 解析
一 狀態機描述 狀態機理論最初的發展在數位電路設計領域。在數位電路方面,根據輸出是否與輸入訊號有關,狀態機可以劃分為mealy型和moore型狀態機 根據輸出是否與輸入訊號同步,狀態機可以劃分為非同步和同步狀態機。而在軟體設計領域,狀態機設計的理論儼然已經自成一體。moore型狀態機的輸出只和當前狀...