標籤:
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++面試題(四)——智能指標的原理和實現