第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

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

3 回答

?
HUX布斯

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個贊

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

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

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();

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


查看完整回答
反對 回復(fù) 2019-05-30
?
PIPIONE

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個贊

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

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

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

它是C+中廣泛使用的良好實(shí)踐,因?yàn)槌耸翘幚碣Y源的一種安全方法之外,它還使代碼更加簡潔,因?yàn)槟恍枰獙㈠e誤處理代碼與主要功能混合使用。

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

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


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

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個贊

“Raii”是“資源獲取是初始化”的意思,實(shí)際上是個用詞不當(dāng)?shù)脑~,因?yàn)樗皇琴Y源采辦(以及對象的初始化)它與之相關(guān),但是釋放資源(通過毀滅(指物體)。
但Raii是我們得到的名字,而且很棒。

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

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

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

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

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

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


查看完整回答
反對 回復(fù) 2019-05-30
  • 3 回答
  • 0 關(guān)注
  • 912 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號