【轉】C++面試題(四)——智能指標的原理和實現

來源:互聯網
上載者:User

標籤:

  C++面試題(四)——智能指標的原理和實現 tanglu2004 http://blog.csdn.net/worldwindjp/
 

  C++面試題(一)、(二)和(三)都搞定的話,恭喜你來到這裡,這基本就是c++面試題的最後一波了。

 

     1,你知道智能指標嗎?智能指標的原理。
     2,常用的智能指標。
     3,智能指標的實現。

  1答案:智能指標是一個類,這個類的建構函式中傳入一個普通指標,解構函式中釋放傳入的指標。智能指標的類都是棧上的對象,所以當函數(或程式)結束時會自動被釋放,

     2, 最常用的智能指標: 

              1)std::auto_ptr,有很多問題。 不支援複製(拷貝建構函式)和賦值(operator =),但複製或賦值的時候不會提示出錯。因為不能被複製,所以不能被放入容器中。

              2) C++11引入的unique_ptr, 也不支援複製和賦值,但比auto_ptr好,直接賦值會編譯出錯。實在想賦值的話,需要使用:std::move。

               例如:

                    std::unique_ptr<int> p1(new int(5));
                    std::unique_ptr<int> p2 = p1; // 編譯會出錯
                    std::unique_ptr<int> p3 = std::move(p1); // 轉移所有權, 現在那塊記憶體歸p3所有, p1成為無效的指標.

              3) C++11或boost的shared_ptr,基於引用計數的智能指標。可隨意賦值,直到記憶體的引用計數為0的時候這個記憶體會被釋放。

              4)C++11或boost的weak_ptr,弱引用。 引用計數有一個問題就是互相引用形成環,這樣兩個指標指向的記憶體都無法釋放。需要手動打破循環參考或使用weak_ptr。顧名思義,weak_ptr是一個弱引用,只引用,不計數。如果一塊記憶體被shared_ptr和weak_ptr同時引用,當所有shared_ptr析構了之後,不管還有沒有weak_ptr引用該記憶體,記憶體也會被釋放。所以weak_ptr不保證它指向的記憶體一定是有效,在使用之前需要檢查weak_ptr是否為空白指標。

 

     3, 智能指標的實現

      下面是一個基於引用計數的智能指標的實現,需要實現構造,析構,拷貝構造,=操作符重載,重載*-和>操作符。

 1 template <typename T> 2 class SmartPointer { 3 public: 4     //建構函式 5     SmartPointer(T* p=0): _ptr(p), _reference_count(new size_t){ 6         if(p) 7             *_reference_count = 1;  8         else 9             *_reference_count = 0; 10     }11     //拷貝建構函式12     SmartPointer(const SmartPointer& src) {13         if(this!=&src) {14             _ptr = src._ptr;15             _reference_count = src._reference_count;16             (*_reference_count)++;17         }18     }19     //重載賦值操作符20     SmartPointer& operator=(const SmartPointer& src) {21         if(_ptr==src._ptr) {22             return *this;23         }24         releaseCount();25         _ptr = src._ptr;26         _reference_count = src._reference_count;27         (*_reference_count)++;28         return *this;29     }30 31     //重載操作符32     T& operator*() {33         if(ptr) {34             return *_ptr;35         }36         //throw exception37     }38     //重載操作符39     T* operator->() {40         if(ptr) {41             return _ptr;42         }43         //throw exception44     }45     //解構函式46     ~SmartPointer() {47         if (--(*_reference_count) == 0) {48             delete _ptr;49             delete _reference_count;50         }51     }52 private:53     T *_ptr;54         size_t *_reference_count;55         void releaseCount() {56         if(_ptr) {57             (*_reference_count)--;58                 if((*_reference_count)==0) {59                     delete _ptr;60                     delete _reference_count;61                 }62         }63         }64 };65 66 int main() 67 {68     SmartPointer<char> cp1(new char(‘a‘));69     SmartPointer<char> cp2(cp1);70     SmartPointer<char> cp3;71     cp3 = cp2;72     cp3 = cp1;73     cp3 = cp3;74     SmartPointer<char> cp4(new char(‘b‘));75     cp3 = cp4;76 }

 

【轉】C++面試題(四)——智能指標的原理和實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.