考慮以下場景:
假設我們有個函式用來顯示處理函式的優先權,另乙個函式(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 注釋...