條款17 以獨立語句將newed 物件置入智慧型指標

2022-01-24 01:08:23 字數 1105 閱讀 6079

考慮以下場景:

假設我們有個函式用來顯示處理函式的優先權,另乙個函式(processwidget())用來在某動態分配所得的widget上進行某些帶有優先權的處理,函式介面如下:

int

priority()

;void

processwidget

(std::tr1::shared_ptr pw,

int priority)

;//使用上述函式

processwidget

(std::tr1::shared_ptr

(new widget)

, priority ())

;

這裡,我們使用了智慧型指標shared_ptr,用來管理分配的widget資源,其目的是為了避免記憶體洩露。但是考慮乙個這個函式的執行過程:

(1)函式呼叫的過程

(2)解析第一步

在第一步中,由於函式有兩個實參,我們需要明確實參的確定順序,然後c++編譯器並不會對實參的確定的順序有硬性的要求,因此它可能是彈性可變的:

第乙個引數:

第二個引數:

(3)出現問題的原因

整體而言,(2)的次序一定是在(1)的後面,但是(3)可能在任何位置,假如引數的確定按照下面次序:

那麼這樣,可能會發生記憶體洩露。因為如果在執行第二步:呼叫priority時發生異常,此時「new widget」返回的指標將會遺失,因為它尚未被置入tr1::shared_ptr內,而這個智慧型指標的存在就是為了防止資源洩漏的。

具體做法:

std::tr1::shared_ptrpw(

new widget)

;//在單獨的語句內以智慧型指標儲存newed所得物件

process

(pw priority()

);//這個呼叫動作就不會造成洩漏

也就是,先將智慧型指標建立好以後,再呼叫該函式。這樣就避免的上述的問題。實際上就是保證,資源在建立出來以後,馬上被內含到智慧型指標物件中,其間不能執行任何語句。也就是保證了上述步驟中,(1)(2)兩步緊緊繫結在一起。

條款17 以獨立語句將newed物件置入智慧型指標

考慮下面兩個函式 int priority void processwidget std shared ptr pw,int priority 然後考慮呼叫processwidget processwidget new widget,priority 但是無法通過編譯,因為無法將new widget...

條款44 GotW 17 型別轉換(Casts)

問題 標準c 中新風格的轉換與舊風格的c轉換相比,具有更強大的功能和安全性。你對它了解多少?本條款中,使用如下的類和全域性變數。class a class b virtual private a struct c a struct d b,c a a1 b b1 c c1 d d1 const a ...

fedora17下以root登陸

以普通使用者登陸時,在進行一些檔案操作時,經常會遇到許可權不夠的問題,fedora又禁止以root使用者登陸,要以root登入按以下操作即可 1 在終端裡切換到root su root 然後輸入密碼 2 修改gdm password檔案 gedit etc pam.d gdm password 注釋...