天天看點

條款14: 在資源管理類中小心copying行為

     并非所有的資源都是heap-based,對于這種資源而言,像auto_ptr和tr1::share_ptr這樣的智能指針往往不适合作為資源掌管者。這個時候我們需要建立自己的資源管理類。

     基礎代碼:

//RAII守則

class Lock{

public:

explicit Lock(Mutex* pm):mutexPtr(pm){

lock(mutexPtr);

}

~Lock(){

unLock(mutexPtr);

}

private:

Mutex* mutexPtr;

};

//使用

Mutex m;

...

{

...

Lock ml(&m);//自動鎖定mutex

... //區塊結束時自動釋放mutex

}

問題:如果對象被複制,會發生什麼情況?

    Lock m1(&m);

    Lock m2(m1);

解決:1、禁止複制,參見條款6。2、“引用計算法”

class Lock{

public:

explicit Lock(Mutex* pm):mutexPtr(pm,unLock){

lock(mutexPtr_.get()); //條款15談GET

}

private:

std::tr1::shared_ptr<Mutex > mutexPtr;

};

注意:

1、複制底部資源,複制資源管理對象時,進行深度複制,如字元串對象内含一個指針指向一塊HEAP記憶體。

2、轉移底部資源的擁有權。參見條款13.

繼續閱讀