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#