您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何理解Boost庫中的scoped_ptr,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
1、VC和VS
VC版并不是標準C++,VS版符合標準C++,其語法相當嚴格。
缺點:VC和VS都只能釋放一個具體類型空間,不能對數組空間進行釋放,還有寫時拷貝的問題;
所以引發了Boost庫的出現來解決此類問題。
2、Boost庫
推薦看一下Boost庫完全開發指南。
Boost本身是開源庫,在C++中的地位舉足輕重,第三章內存管理,智能指針;
C++中也提供了智能指針,但是并不能解決所有問題。
smart_ptr庫中:new delete的運用不正確,是C++中造成資源獲取/釋放問題的根源,
3、scoped_ptr(局部智能指針)
(1)、如何使用
scoped_ptr是一個很類似auto_ptr的智能指針,但是scoped_ptr的所有權更加嚴格,不能轉讓,一旦scoped_ptr獲取了對象的管理權,你就無法再從它那里取回來。
平常的智能指針加上#include<memory>頭文件,Boost庫的搭建,就是拷到相應的目錄下;然后編譯,出錯進去把該注釋的都注釋上。
#include<iostream> #include<string> #include<boost/smart_ptr.hpp> //:在include目錄下的boost目錄下的smart_ptr.hpp; using namespace std; //打開就是其它智能指針的聲明; using namespace boost; //boost庫必須引入的命名空間 int main(void){ int *p = new int(10); scoped_ptr<int> ps(p); cout<<*ps<<endl; //有了指針功能*運算符 string *px = new string("hello"); scoped_ptr<string> ps1(px); cout<<ps1->size()<<endl;//有了->,指針 }
在庫的引入下,確實具有智能指針的特性。必須加上
#include<boost/smart_ptr.hpp> 和 using namespace boost;,才具有智能指針的特性。
對比:VC和VS版的拷貝構造,賦值都沒問題,
scoped_ptr(局部智能指針),對空間的管理權不能交由其它對象,不能進行拷貝構造和賦值。
4、scoped_ptr的內部實現過程
如何達到擁有權不能轉移的目的,拷貝構造和賦值語句聲明為私有的,不需要實現。
模擬源碼實現如下:
#include<iostream> using namespace std; template<class T> class scoped_ptr{ public: scoped_ptr(T *p = 0) : px(p){} ~scoped_ptr(){ delete px; } public: T& operator*()const{ return *px; } T* operator->()const{ return px; } T* get()const{ return px; }/* void reset(T *p = 0){ if(p != px && px){ delete px; } px = p; }*/ //boost庫中有一個更好的解決方案 typedef scoped_ptr<T> this_type; void reset(T *p = 0){ this_type(p).swap(*this); //無名臨時對象技術 } void swap(scoped_ptr &b){ T *tmp = b.px; b.px = px; px = tmp; } private: //不想讓其擁有哪些功能,聲明為私有即可。 scoped_ptr(const scoped_ptr<T> &);//聲明為私有,外部就無法進行拷貝構造了 scoped_ptr& operator=(const scoped_ptr<T> &);//外部就調不動賦值語句了 void operator==(scoped_ptr const &) const; //對象不具有比較== void operator!=(scoped_ptr const &) const; //對象不具有比較!= T *px; }; class Test{ public: void fun(){ cout<<"This is Test fun()"<<endl; } }; int main(void){ int *p = new int(10); scoped_ptr<int> ps(p); cout<<*ps<<endl; int *q = new int(20); ps.reset(q); //重新設置函數,將原有空間釋放,重新管理一個空間 scoped_ptr<Test> ps1(new Test); ps1->fun(); }
對reset()函數的理解:this_type(p).swap(*this);模型如下:
通過新生成的無名臨時變量,將新地址與舊地址交換,在最后脫離函數范圍,對象消亡,調用析構函數,釋放
原先空間,達到不內存泄漏,并且對新空間進行管理。
缺點:不能對數組空間進行管理。
關于如何理解Boost庫中的scoped_ptr就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。