聽(tīng)到這么高端霸氣的名字頓覺(jué)自己極致土鱉,介是何方神圣呢固惯,其全稱(chēng)是Resource Acquisition Is Initialization?其起源是為了完成異常安全資源管理的愿景。
RAII中資源的持有是與對(duì)象的生命周期完全吻合在一起的:資源分配在對(duì)象創(chuàng)建的時(shí)候完成,而在對(duì)象析構(gòu)時(shí)完成資源的釋放。只要對(duì)象適當(dāng)?shù)劁N(xiāo)毀他托,資源泄漏就不會(huì)發(fā)生。
示例代碼如下:
上面這段代碼是異常安全的仆葡,因?yàn)镃++保證在enclosing作用域結(jié)束時(shí)上祈,會(huì)銷(xiāo)毀所有棧變量,可參考stack unwinding? ,不管是否發(fā)生異常lock和file對(duì)象在從當(dāng)前函數(shù)中返回時(shí)會(huì)浙芙,它們的析構(gòu)函數(shù)會(huì)被調(diào)用。局部變量使得在單個(gè)函數(shù)中進(jìn)行多個(gè)資源的管理變得很簡(jiǎn)單:局部變量會(huì)按它們構(gòu)造的反序進(jìn)行析構(gòu)籽腕,并且一個(gè)對(duì)象必須在完全構(gòu)造(即構(gòu)造的過(guò)程中沒(méi)有發(fā)生異常)之后才會(huì)被銷(xiāo)毀嗡呼。
Stroustrup在比較RAII與java中的finally的時(shí)候放了狠話(huà):現(xiàn)實(shí)中,資源獲取的場(chǎng)景比資源的種類(lèi)要多得多得多皇耗,所以RAII比f(wàn)inally結(jié)構(gòu)用的代碼會(huì)更少南窗。
所以問(wèn)題來(lái)了,異常發(fā)生的時(shí)候,怎樣保證局部變量的析構(gòu)呢万伤?
另外動(dòng)態(tài)分配的對(duì)象也可以由RAII機(jī)制控制窒悔,以便RAII對(duì)象(局部變量)析構(gòu)時(shí)相應(yīng)資源被釋放。為了達(dá)到這個(gè)目的敌买,可以使用C++11中定義的智能指針std::unique_ptr和std::shared_ptr,C++98中對(duì)應(yīng)的是std::auto_ptr和boost中的boost::shared_ptr简珠。
意外發(fā)現(xiàn)一個(gè)進(jìn)階的C機(jī)制