RAII是什么
RAII全稱是“Resource Acquisition is Initialization”,即資源獲取即初始化。RAII技術被認為是C++中管理資源、避免泄露的最佳方法,可以實現安全、簡潔的狀態管理,編寫出優雅的異常安全的代碼。因為C++的語言機制保證了,當一個對象創建的時候,自動調用構造函數,當對象超出作用域的時候會自動調用析構函數。RAII的做法是使用一個對象,在其構造時獲取對應的資源,在對象生命期內控制對資源的訪問,使之始終保持有效,最后在對象析構的時候,釋放構造時獲取的資源。
如網絡套接字、互斥鎖、文件句柄和內存等等,它們屬於系統資源。使用RAII對這些資源進行管理。智能指針(std::shared_ptr和std::unique_ptr)即RAII最具代表的實現,使用智能指針,可以實現自動的內存管理,再也不需要擔心忘記delete造成的內存泄漏。
RAII用例
由於系統的資源不具有自動釋放的功能,而C++中的類具有自動調用析構函數的功能。如果把資源用類進行封裝起來,對資源操作都封裝在類的內部,在析構函數中進行釋放資源。當定義的局部變量的生命結束時,它的析構函數就會自動的被調用,如此,就不用程序員顯示的去調用釋放資源的操作了。
#include <iostream> #include <windows.h> #include <process.h> using namespace std; CRITICAL_SECTION cs; int gGlobal = 0; class MyLock { public: MyLock() { EnterCriticalSection(&cs); } ~MyLock() { LeaveCriticalSection(&cs); } private: MyLock( const MyLock &); MyLock operator =(const MyLock &); }; void DoComplex(MyLock &lock ) { } unsigned int __stdcall ThreadFun(PVOID pv) { MyLock lock; int *para = (int *) pv; // I need the lock to do some complex thing DoComplex(lock); for (int i = 0; i < 10; ++i) { ++gGlobal; cout<< "Thread " <<*para<<endl; cout<<gGlobal<<endl; } return 0; } int main() { InitializeCriticalSection(&cs); int thread1, thread2; thread1 = 1; thread2 = 2; HANDLE handle[2]; handle[0] = ( HANDLE )_beginthreadex(NULL , 0, ThreadFun, ( void *)&thread1, 0, NULL ); handle[1] = ( HANDLE )_beginthreadex(NULL , 0, ThreadFun, ( void *)&thread2, 0, NULL ); WaitForMultipleObjects(2, handle, TRUE , INFINITE ); return 0; }
參考
zhaozhengcoderC++中的RAII機制