舉個例子:
class
teamsys
teamsys*
createteamsys()
;//返回指向動態分配的物件teamsys的指標,呼叫者有責任刪除它。
voidf(
)
以上**中…,可能會出現異常或者return ,會導致ts所指向的物件資源無法被釋放。
1.使用auto_ptr可以避免f函式潛在的資源洩露可能性:
voidf(
)
auto_ptr被銷毀時會自動刪除它所指之物。
auto_ptr有乙個性質:若通過copy建構函式或copy assignment操作符複製它們,它們就會變成null,而複製所得的指標將取得資源的唯一擁有權。
2.引用計數型智慧型指標(reference counting smart pointer rcsp)。
voidf(
)
auto_ptr和tr1::shared_ptr兩者都在其析構函式內做delete而不是delete動作。所以動態分配而得的array不應該使用這兩者。如果你非要這樣幹,你可以使用boost::scoped_array和boost::shared_array classes。
請記住
class
lock
~lock()
private
: mutex *mutexptr};
mutex m;
//需要鎖定的互斥器
lock ml1
(&m)
;//鎖定
lock ml2
(ml1)
;//將ml1複製到ml2,會發生什麼事?
解決方案:1.禁止複製 2.對底層資源祭出」引用計數「
class
lock
//unlock 為刪除器
private
: tr1::shared_ptr mutexptr;
//不需要析構函式,因為預設系統函式會自動呼叫其成員變數的析構函式,mutexptr引用計數為0時,會自動刪除器unlock
};
請記住
利用資源管理類可以避免資源洩露,但是當你執行下面語句時,
std::tr1::shared_ptrts(
createteamsys()
);intcountsmember
(const teamsys pt)
;int counts =
countsmember
(ts)
;//錯誤,因為countsmember需要的是乙個teamsys指標
解決方法:顯示轉換和隱式轉換
1.tr1::shared_ptr和auto_ptr都提供乙個get成員函式:countsmember(ts.get())
返回智慧型指標內部的原始指標。
2.
fonthandle getfont()
;void
releasefont
(fonthandle dh)
;class
font
fonhandle get()
const
;//顯式轉換函式
operator
fonthandle()
const
//隱式轉換函式
~font()
private
: fonthandle f;};
void
changefontsize
(fonthandle f,
int newsize)
;font f
(getfont()
);intnew fontsize;..
.changefontsize
(f.get()
,newfontsize)
;顯式轉換
changefontsize
(f,newfontsize)
;隱式轉換
但是隱式轉換會增加錯誤發生機會,如下:
font f1
(getfont()
)...
fonthandle f2 = f1;
//原意是想拷貝font物件,現在反而將f1隱式轉換為fonthandler,然後才複製它
f1中管理乙個fonthandle物件,但是這個fonthandle物件可以直接使用分取得,如果f1不會銷毀,f2就是」虛吊的「。
請記住
string* str1 =
new string;
string* str2 =
new string[10]
;delete str1;
delete
str2;
typedef string addresslines[4]
;string* pa1 =
new addresslines;
//相當於new string[4]
delete pal;
//行為未定義
delete
pal;
//正確,呼叫者容易忘記寫,因為new的時候沒有
請記住
舉個例子:
int
priority()
;void
processwidget
(std::tr1::shared_ptr pw,
int priority)
;processwidget
(std::tr1::shared_ptr
(new widget)
,priority()
);
c++編譯器以什麼樣的順序執行上面語句的?彈性很大。如果編譯器是這樣執行的:new widget=》priority()=》tr1::shared_ptr。這樣的話,如果prority()發生異常,widget物件尚未置入tr1::shared_ptr內,這個指標是資源管理物件,資源沒有被轉換為資源管理物件,這是錯誤的。
我們可以通過分離語句的方法避免這類問題:
std::tr1::shared_ptrpw(
new widget)
;processwidget
(pw,prority)
;
請記住 條款13 17 資源管理
2.rall class的準則 資源在建構函式期間獲得,在析構函式期間釋放 常見的幾種設計方式 禁止複製 也就是禁止管理類的拷貝建構函式和拷貝賦值操作符 施用引用計數法 例如管理資源為heap物件時,可以使用shared ptr管理 shared ptr支援當引用計數為0時,自定義刪除器替代dele...
C 實現 26 31條款
std string str str password 將password作為encrypted的初值,跳過毫無意義的default構造過程 std string str password 上述行為可以避免構造非必要物件,還可以避免無意義的default構造行為。c風格的轉型 t expressio...
C 資源管理之 RAII
raii,它是 r esource acquisition is initialization 的首字母縮寫。也稱為 資源獲取就是初始化 是c 等程式語言常用的管理資源 避免記憶體洩露的方法。它保證在任何情況下,使用物件時先構造物件,最後析構物件。raii的好處在於它提供了一種資源自動管理的方式,當...