C++中的RAII机制
生活随笔
收集整理的這篇文章主要介紹了
C++中的RAII机制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
什么是RAII?
RAII是Resource Acquisition Is Initialization(wiki上面翻譯成 “資源獲取就是初始化”)的簡稱,是C++語言的一種管理資源、避免泄漏的慣用法。利用的就是C++構造的對象最終會被銷毀的原則。RAII的做法是使用一個對象,在其構造時獲取對應的資源,在對象生命期內控制對資源的訪問,使之始終保持有效,最后在對象析構的時候,釋放構造時獲取的資源
為什么要使用RAII?
上面說到RAII是用來管理資源、避免資源泄漏的方法。那么,用了這么久了,也寫了這么多程序了,口頭上經常會說資源,那么資源是如何定義的?在計算機系統中,資源是數量有限且對系統正常運行具有一定作用的元素。比如:網絡套接字、互斥鎖、文件句柄和內存等等,它們屬于系統資源。由于系統的資源是有限的,就好比自然界的石油,鐵礦一樣,不是取之不盡,用之不竭的,所以,我們在編程使用系統資源時,都必須遵循一個步驟:
- 1 申請資源;
- 2 使用資源;
- 3 釋放資源。
第一步和第二步缺一不可,因為資源必須要申請才能使用的,使用完成以后,必須要釋放,如果不釋放的話,就會造成資源泄漏
一個最簡單的例子:
#include <iostream> using namespace std; int main() { int *testArray = new int [10]; // Here, you can use the array delete [] testArray; testArray = NULL ; return 0; }小結:
但是如果程序很復雜的時候,需要為所有的new 分配的內存delete掉,導致極度臃腫,效率下降,更可怕的是,程序的可理解性和可維護性明顯降低了,當操作增多時,處理資源釋放的代碼就會越來越多,越來越亂。如果某一個操作發生了異常而導致釋放資源的語句沒有被調用,怎么辦?這個時候,RAII機制就可以派上用場了。
如何使用RAII?
當我們在一個函數內部使用局部變量,當退出了這個局部變量的作用域時,這個變量也就別銷毀了;當這個變量是類對象時,這個時候,就會自動調用這個類的析構函數,而這一切都是自動發生的,不要程序員顯示的去調用完成。這個也太好了,RAII就是這樣去完成的。
由于系統的資源不具有自動釋放的功能,而C++中的類具有自動調用析構函數的功能。如果把資源用類進行封裝起來,對資源操作都封裝在類的內部,在析構函數中進行釋放資源。當定義的局部變量的生命結束時,它的析構函數就會自動的被調用,如此,就不用程序員顯示的去調用釋放資源的操作了。
使用RAII 機制的代碼:
#include <iostream> using namespace std; class ArrayOperation { public : ArrayOperation() { m_Array = new int [10]; } void InitArray() { for (int i = 0; i < 10; ++i) { *(m_Array + i) = i; } } void ShowArray() { for (int i = 0; i <10; ++i) { cout<<m_Array[i]<<endl; } } ~ArrayOperation() { cout<< "~ArrayOperation is called" <<endl; if (m_Array != NULL ) { delete[] m_Array; // 非常感謝益可達非常犀利的review,詳細可以參加益可達在本文的評論 2014.04.13m_Array = NULL ; } } private : int *m_Array; }; bool OperationA(); bool OperationB(); int main() { ArrayOperation arrayOp; arrayOp.InitArray(); arrayOp.ShowArray(); return 0; }上述的兩個例子都是RAII機制的應用,理解了上面的例子,就應該能理解了RAII機制的使用了。
總結
以上是生活随笔為你收集整理的C++中的RAII机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通俗易懂解释一下C++的构造函数是怎样的
- 下一篇: 解决python安装第三方库速度很慢的问