C++箴言:資源管理類的拷貝行為

字號:

在上一篇文章中介紹了作為資源管理類支柱的 Resource Acquisition Is Initialization (RAII) 原則,并描述了 auto_ptr 和 tr1::shared_ptr 在基于堆的資源上運用這一原則的表現(xiàn)。并非所有的資源都是基于堆的,然而,對于這樣的資源,像 auto_ptr 和 tr1::shared_ptr 這樣的智能指針通常就不像 resource handlers(資源管理者)那樣合適。在這種情況下,有時,你可能要根據(jù)你自己的需要去創(chuàng)建你自己的資源管理類。
    例如,假設你使用 C API 提供的 lock 和 unlock 函數(shù)去操縱 Mutex 類型的互斥體對象:
    void lock(Mutex *pm); // lock mutex pointed to by pm
    void unlock(Mutex *pm); // unlock the mutex
    為了確保你從不會忘記解鎖一個被你加了鎖的 Mutex,你希望創(chuàng)建一個類來管理鎖。RAII 原則規(guī)定了這樣一個類的基本結構,通過構造函數(shù)獲取資源并通過析構函數(shù)釋放它:
    class Lock {
    public:
     explicit Lock(Mutex *pm)
     : mutexPtr(pm)
     { lock(mutexPtr); } // acquire resource
     ~Lock() { unlock(mutexPtr); } // release resource
    private:
     Mutex *mutexPtr;
    };
    客戶按照 RAII 風格的慣例來使用 Lock:
    Mutex m; // define the mutex you need to use
    ...
    { // create block to define critical section
    Lock ml(&m); // lock the mutex
    ... // perform critical section operations
    } // automatically unlock mutex at end
    // of block