亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是資源獲取是初始化(Raii)?

什么是資源獲取是初始化(Raii)?

C++ C
忽然笑 2019-05-30 17:27:10
什么是資源獲取是初始化(Raii)?什么是資源獲取是初始化(Raii)?
查看完整描述

3 回答

?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

對于一個非常強大的概念來說,這是一個非常糟糕的名字,也可能是C+開發人員在切換到其他語言時忽略的第一件事情之一。有一些運動試圖將這個概念重新命名為范圍資源管理雖然它似乎還沒有流行起來。

當我們說“資源”時,我們不僅僅是指內存-它可以是文件句柄、網絡套接字、數據庫句柄、GDI對象.總之,我們有限的供應,所以我們需要能夠控制它們的使用?!胺秶壎ā狈矫嬉馕吨鴮ο蟮纳嫫诮壎ǖ阶兞康淖饔糜?,因此當變量超出作用域時,析構函數將釋放資源。它的一個非常有用的特性是,它提供了更大的例外安全性。例如,比較一下:

RawResourceHandle* handle=createNewResource();handle->performInvalidOperation();  // Oops, throws exception...deleteResource(handle); 
// oh dear, never gets called so the resource leaks

和Raii一號

class ManagedResourceHandle {public:
   ManagedResourceHandle(RawResourceHandle* rawHandle_) : rawHandle(rawHandle_) {};
   ~ManagedResourceHandle() {delete rawHandle; }
   ... // omitted operator*, etcprivate:
   RawResourceHandle* rawHandle;};ManagedResourceHandle handle(createNewResource());handle->performInvalidOperation();

在后一種情況下,當拋出異常并解除堆棧時,將銷毀局部變量,這將確保我們的資源被清理,不會泄漏。


查看完整回答
反對 回復 2019-05-30
?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

這是一個編程成語,意思是

  • 將資源封裝到類中(其構造函數通常(但不一定是*)獲取資源,其析構函數總是釋放資源)
  • 通過類的本地實例使用資源*
  • 當對象超出作用域時,資源將自動釋放。

這保證了無論在使用資源時發生什么,它最終都會被釋放(無論是由于正常返回、銷毀包含的對象或引發的異常)。

它是C+中廣泛使用的良好實踐,因為除了是處理資源的一種安全方法之外,它還使代碼更加簡潔,因為您不需要將錯誤處理代碼與主要功能混合使用。

* 最新情況:“局部變量”可能指類的局部變量或非靜態成員變量。在后一種情況下,成員變量將使用其所有者對象進行初始化和銷毀。

** UPDATE 2:正如@SBI指出的那樣,盡管資源通常是在構造函數內分配的,但也可以在外部分配,并作為參數傳入。


查看完整回答
反對 回復 2019-05-30
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

“Raii”是“資源獲取是初始化”的意思,實際上是個用詞不當的詞,因為它不是資源采辦(以及對象的初始化)它與之相關,但是釋放資源(通過毀滅(指物體)。
但Raii是我們得到的名字,而且很棒。

這個成語的核心功能是將資源(內存塊、打開的文件、未鎖定的互斥體、您命名的it)封裝在局部的、自動的對象,并讓該對象的析構函數在對象所屬范圍的末尾銷毀該對象時釋放該資源:

{
  raii obj(acquire_resource());
  // ...} // obj's dtor will call release_resource()

當然,對象并不總是本地的、自動的對象。他們也可以是一個階級的成員:

class something {private:
  raii obj_;  // will live and die with instances of the class
  // ... };

如果這樣的對象管理內存,它們通常被稱為“智能指針”。

這方面有很多不同的地方。例如,在第一個代碼片段中,出現了一個問題:如果有人想要復制,會發生什么?obj。最簡單的解決辦法就是簡單地不允許復制。std::unique_ptr<>在下一個C+標準中作為標準庫的一部分的智能指針就是這樣做的。
另一個這樣的智能指針,std::shared_ptr它所擁有的資源(動態分配的對象)的“共享所有權”特性。也就是說,它可以自由復制,所有副本都引用同一個對象。智能指針跟蹤引用同一個對象的副本的數量,并在最后一個對象被銷毀時刪除它。
第三個變體的特點是std::auto_ptr它實現了一種移動語義:一個對象只有一個指針,試圖復制一個對象將導致(通過語法黑客)將對象的所有權傳遞給復制操作的目標。


查看完整回答
反對 回復 2019-05-30
  • 3 回答
  • 0 關注
  • 915 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號