考慮下面兩個函式
然後考慮呼叫processwidgetint
priority()
;void
processwidget
(std::shared_ptr pw,
int priority)
;
但是無法通過編譯,因為無法將processwidget
(new widget,
priority()
);
new widget
的原始指標轉化為processwidget所要求的只能指標,解決辦法是將呼叫改寫為如下形式:
在呼叫processwidget
(std::shared_ptr
(new widget)
,priority()
);
processwidget
函式體之前,編譯器必須建立**,做如下三件事:
執行new widget
呼叫priority
呼叫shared_ptr
建構函式
則可能會出現對proority
的呼叫異常,然後導致new widget
返回的執行丟失,造成資源洩露,要避免這類問題辦法是分別寫出(1)建立widget,(2)將它置入只能指標內嗎,最後傳入processwidget函式內
std::shared_ptrpw(
new widget)
;// 在單獨語句內以只能指標
processwidget
(pw,
priority()
);
條款17 以獨立語句將newed 物件置入智慧型指標
考慮以下場景 假設我們有個函式用來顯示處理函式的優先權,另乙個函式 processwidget 用來在某動態分配所得的widget上進行某些帶有優先權的處理,函式介面如下 int priority void processwidget std tr1 shared ptr pw,int priori...
條款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 注釋...