天天看點

C++面試題(四)——智能指針的原理和實作

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, 智能指針的實作

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

轉載自http://blog.csdn.net/worldwindjp/article/details/18843087#

繼續閱讀