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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

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

3 回答

?
HUX布斯

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

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

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

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

和Raii一號(hào)

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

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


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

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

這是一個(gè)編程成語(yǔ),意思是

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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