RAII 資源獲取即初始化

2021-04-17 18:56:17 字數 923 閱讀 2063

摘自《extended stl》中譯

資源獲取即初始化(raii, resource acquisition is initialization)是指,當你獲得乙個資源的時候,不管這個資源是物件、記憶體、檔案控制代碼或者其它什麼,你都會在乙個物件的建構函式中獲得它,並且在該物件的析構函式中釋放它。實現這種功能的類,我們就說它採用了"資源獲取即初始化(raii)"的方式。這樣的類常常被稱為封裝類。

可以依據資源可變性和資源**這兩個特徵,來對raii進行分類。

如果乙個封裝類對其實例提供額外的功能,使得其實例能被賦予新資源,這個類表現出的這種特徵即稱為"可變的raii",否則就是"不可變的raii"。

不可變的raii,是使用起來最簡單的一種。說它簡單,是因為在這種情況下,無需在封裝類中提供用於指定資源的方法--不管是新分配的資源,還是對其他資源進行拷貝。這種raii還意味著,類的析構函式總是可以假定,被封裝的資源是有效的。

與此相反,提供可變的raii的類,就需要實現下列功能中的絕大部分,或者全部:預設的或者空的建構函式,拷貝建構函式,拷貝賦值操作,用於指定資源的方法。最重要的是,這樣的類在析構函式和任何類似close()的方法中,釋放資源前,都必須檢測被封裝的資源是不是null。

對於提供raii的類來說,第二個重要的特徵是,它們通過什麼途徑獲取自己所管理的資源。以std::string為代表的類,使用的是內部初始化的raii:它管理的資源--即記憶體中用於儲存字元的緩衝區--是由它自己建立的,這一資源對外永遠是不可見的。與此不同的是,以std::auto_ptr為代表的類表現出外部初始化的raii行為:它所管理的資源,是使用它的客戶程式(通過另外的某種方式獲得之後)交給它的。

內部初始化的raii的封裝類,一般比較容易實現,但是功能上也比較受限制,因為它們獲取資源的機制是預先定義好的,並且是固定不變的。不過,這樣的類用起來也容易一些,或者說,比較難被誤用:因為客戶**幾乎沒有機會犯下能導致資源洩露的錯誤。

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

aii,也稱為 資源獲取就是初始化 是c 等程式語言常用的管理資源 避免記憶體洩露的方法。它保證在任何情況下,使用物件時先構造物件,最後析構物件。raii 1 resource acquisition is initialization 也成為 資源獲取就是初始化 是c 語言的一種管理資源 避免洩漏...

筆記 C RAII 資源獲取即初始化

raii resource acquisition is initialization 是由bjarne stroustrup提出的一種使用區域性物件來管理資源 記憶體,檔案,網路 的方式 資源 一直是乙個令人頭疼的問題,人們總是在new class 後忘了在正確的地方delete它,僅僅是因為這種...

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...