effective c++ 在資源管理類中小心copying 行爲

資源取得時機便是初始化時機

class Mutex{};
void lock(Mutex* p){}
void unlock(Mutex* p){}
class Lock
{
public:
    explicit Lock(Mutex *p)
    :mutexPtr(p)
    {
        lock(mutexPtr);
    }
    ~Lock()
    {
        unlock(mutexPtr);
    }
private:
    Mutex *mutexPtr;
};

爲確保不會忘記解鎖Mutex互斥對象,可能會設計一個class來管理

用戶對Lock的用法:

Mutex m;
    {
        Lock m1(&m);//鎖定互斥鎖
    }                         //在區塊最末尾,自動接觸互斥鎖鎖定
Lock m1(&m);
Lock m2(m1);

如果試圖複製Lock對象怎麼辦?!

1.禁止複製,通過聲明private拷貝構造函數或者私有繼承自己定義Uncopyable類
2.對底層資源祭出“引用計數法”
比如shared_ptr
並且將缺省行爲“當引用次數爲0時刪除所指物”改成解鎖
(shared_ptr允許制定所謂的“刪除器”)

class Mutex{};
void lock(Mutex* p){cout << "lock" << endl;}
void unlock(Mutex* p){cout << "unlock" << endl;}
class Lock
{
public:
    explicit Lock(Mutex *p)
    :mutexPtr(p,unlock)
    {
        lock(mutexPtr.get());
        //返回Mutex類型的指針
    }
private:
    shared_ptr<Mutex>mutexPtr;
};
int main()
{
    Mutex m;
    {
        cout << "---------------------" << endl;
        Lock m1(&m);
        cout << "---------------------" << endl;
        Lock m2(m1);
        cout << "---------------------" << endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章