RAII,也稱為「資源獲取就是初始化」

2021-06-19 16:44:12 字數 1604 閱讀 2139

aii,也稱為「資源獲取就是初始化」,是c++等程式語言常用的管理資源、避免記憶體洩露的方法。它保證在任何情況下,使用物件時先構造物件,最後析構物件。

raii

[1](resource acquisition is initialization),也成為「資源獲取就是初始化」,是c++語言的一種管理資源、避免洩漏的慣用法。c++標準保證任何情況下,已構造的物件最終會銷毀,即它的析構函式最終會被呼叫。簡單的說,raii 的做法是使用乙個物件,在其構造時獲取資源,在物件生命期控制對資源的訪問使之始終保持有效,最後在物件析構的時候釋放資源。

根據raii

[2]對資源的所有權可分為常性型別和變性型別,代表者分別是boost:shared_ptr<>[2]和std::auto_ptr<>;從所管資源的初始化位置上可分為外部初始化型別和內部初始化型別。

常性型別是指獲取資源的地點是建構函式,釋放點是析構函式,並且在這兩點之間的一段時間裡,任何對該raii型別例項的操縱都不應該從它手裡奪走資源的所有權。變性型別是指可以中途被設定為接管另乙個資源,或者乾脆被置為不擁有任何資源。外部初始化型別是指資源在外部被建立,並被傳給raii例項的建構函式,後者進而接管了其所有權。boost:shared_ptr<>和std::auto_ptr<>都是此型別。與之相對的是內部初始化型別。

其中,常性且內部初始化的型別是最為純粹的raii形式,最容易理解,最容易編碼。

每當處理需要配對的獲取/釋放函式呼叫的資源時,都應該將資源封裝在乙個物件中,實現自動資源釋放。例如,我們無需直接呼叫一對非成員函式openport/closeport,而是可以考慮定義常性且內部初始化的raii概念的「埠」操作類:

class port;

void dosomething()

shared_ptrpost2 = /*…*/; //port2在最後乙個引用它的

//shared_ptr離開作用域後關閉

通過使用上述raii型別,可以避免程式設計師忘記關閉埠而引起的洩漏,還可以確保異常發生時棧展開過程中自動釋放埠資源。

stl容器是基於值語義的,在容器內部,物件是常被複製的。如果raii型別需要存入stl容器,需要作一些處理。

class resource

~ resource()

private:

int handle;

};std::map< identifier, resource > resourcemap;

以上**中stl容器對resource的複製將導致執行期錯誤。最好的方法是讓raii型別繼承於boost::noncopyable[2],而後在容器中使用引用計數的指標:

class resource : public boost::noncopyable

~ resource()

private:

int handle;

};typedef boost::shared_ptrpointertoresourcetype;

typedef std::map< identifier, pointertoresourcetype> resourcemaptype;

resourcemaptype resourcemap;

作為替代,還可以使用非拷貝行為的容器:boost::ptr_mapmap;

RAII 資源獲取即初始化

摘自 extended stl 中譯 資源獲取即初始化 raii,resource acquisition is initialization 是指,當你獲得乙個資源的時候,不管這個資源是物件 記憶體 檔案控制代碼或者其它什麼,你都會在乙個物件的建構函式中獲得它,並且在該物件的析構函式中釋放它。實現...

RAII 資源建立即釋放

raii是一種技術,利用了c 區域性物件在跳出作用域時執行析構函式的機制,將一些資源的釋放安排在析構函式中,保證安全的使用資源。舉個例子 a.h class a a.cpp a a int size a a void a setmem int size,char value main.cpp inc...

C 資源管理之 RAII

raii,它是 r esource acquisition is initialization 的首字母縮寫。也稱為 資源獲取就是初始化 是c 等程式語言常用的管理資源 避免記憶體洩露的方法。它保證在任何情況下,使用物件時先構造物件,最後析構物件。raii的好處在於它提供了一種資源自動管理的方式,當...