出現(xiàn)智能指針的原因
10年積累的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有上海免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
常見的智能指針
1.你知道智能指針嗎?智能指針的原理。
2.常用的智能指針。
3.智能指針的實(shí)現(xiàn)。
1答案:智能指針是一個(gè)類,這個(gè)類的構(gòu)造函數(shù)中傳入一個(gè)普通指針,析構(gòu)函數(shù)中釋放傳入的指針。智能指針的類都是棧上的對象,所以當(dāng)函數(shù)(或程序)結(jié)束時(shí)會自動被釋放,
2, 最常用的智能指針:
1)std::auto_ptr,有很多問題。 不支持復(fù)制(拷貝構(gòu)造函數(shù))和賦值(operator =),但復(fù)制或賦值的時(shí)候不會提示出錯。因?yàn)椴荒鼙粡?fù)制,所以不能被放入容器中。
2) C++11引入的unique_ptr(scoped_ptr), 也不支持復(fù)制和賦值,但比auto_ptr好,直接賦值會編譯出錯。實(shí)在想賦值的話,需要使用:std::move。
例如:
std::unique_ptr
std::unique_ptr
std::unique_ptr
3) C++11或boost的shared_ptr,基于引用計(jì)數(shù)的智能指針。可隨意賦值,直到內(nèi)存的引用計(jì)數(shù)為0的時(shí)候這個(gè)內(nèi)存會被釋放。
4)C++11或boost的weak_ptr,弱引用。 引用計(jì)數(shù)有一個(gè)問題就是互相引用形成環(huán),這樣兩個(gè)指針指向的內(nèi)存都無法釋放。需要手動打破循環(huán)引用或使用weak_ptr。顧名思義,weak_ptr是一個(gè)弱引用,只引用,不計(jì)數(shù)。如果一塊內(nèi)存被shared_ptr和weak_ptr同時(shí)引用,當(dāng)所有shared_ptr析構(gòu)了之后,不管還有沒有weak_ptr引用該內(nèi)存,內(nèi)存也會被釋放。所以weak_ptr不保證它指向的內(nèi)存一定是有效的,在使用之前需要檢查weak_ptr是否為空指針。
智能指針的實(shí)現(xiàn)
Autoptr
代碼:
#pragma once templateclass Autoptr { public: Autoptr() :_ptr(NULL) {} Autoptr(T *ptr) :_ptr(ptr) {} Autoptr(Autoptr & a) :_ptr(a._ptr) { delete _ptr; a._ptr = NULL; } ~Autoptr() { if (_ptr) { delete _ptr; _ptr = NULL; } } Autoptr & operator=(Autoptr &a) { if (this != &a) { delete _ptr; _ptr = a._ptr; a._ptr = NULL; } return *this; } T& operator*() { return *_ptr; } T* Getptr() { return _ptr; } protected: T *_ptr; }; void Autoptrtest() { int *a = new int(5); Autoptr ap1(a); cout << *ap1 << endl; cout << ap1.Getptr() << endl; Autoptr ap2(ap1); cout << *ap2 << endl; cout << ap2.Getptr() << endl; cout << ap1.Getptr() << endl; Autoptr ap3; ap3 = ap2; cout << *ap3 << endl; cout << ap3.Getptr() << endl; cout << ap2.Getptr() << endl; }
Scopedptr
代碼:
#pragma once templateclass Scopedptr { public: Scopedptr() :_ptr(NULL) {} Scopedptr(T *data) :_ptr(data) {} ~Scopedptr() { if (_ptr) { delete _ptr; _ptr = NULL; } } T& operator*() { return *_ptr; } T* Getptr() { return _ptr; } protected://加上protected可以防止使用者在類之外定義拷貝構(gòu)造和運(yùn)算符的重載函數(shù) Scopedptr (const Scopedptr &sp); //不讓使用者使用拷貝,可以防止拷貝,所以只聲明不定義 Scopedptr & operator=(const Scopedptr &sp); private: T *_ptr; }; void Scopedptrtest() { int *a = new int(5); Scopedptr ap1(a); cout << *ap1 << endl; cout << ap1.Getptr() << endl; /*Scopedptr ap2(ap1); cout << *ap2 << endl; Scopedptr ap3; ap3 = ap2; cout << *ap3 << endl; cout << ap3.Getptr() << endl; cout << ap2.Getptr() << endl;*/ }
Sharedptr
代碼:
#pragma once templateclass Sharedptr { public: Sharedptr() :_ptr(NULL) , _pcount(new int(1)) {} Sharedptr(T *ptr) :_ptr(ptr) , _pcount(new int(1)) {} Sharedptr(const Sharedptr & sp) :_ptr(sp._ptr) , _pcount(sp._pcount) { ++(*_pcount); } ~Sharedptr() { if (_ptr) { if (--(*_pcount)==0) { delete _ptr; delete _pcount; _ptr = NULL; _pcount = NULL; } _ptr = NULL; } } Sharedptr & operator=(const Sharedptr &sp) { if (this != &sp) { if (--(*_pcount) == 0) { delete _ptr; delete _pcount; _ptr = NULL; _pcount = NULL; } _ptr = sp._ptr; _pcount = sp._pcount; ++(*_pcount); } return *this; } private: T* _ptr; int *_pcount; }; void Sharedptrtest() { int *a = new int(5); Sharedptr ap1(a); Sharedptr ap2(ap1); Sharedptr ap3; ap3 = ap2; }