国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++ 中boost::share_ptr智能指針的使用方法

2020-05-23 13:46:36
字體:
來源:轉載
供稿:網友

C++ 中boost::share_ptr智能指針的使用方法

最近項目中使用boost庫的智能指針,感覺智能指針還是蠻強大的,在此貼出自己學習過程中編寫的測試代碼,以供其他想了解boost智能指針的朋友參考,有講得不正確之處歡迎指出討論。當然,使用boost智能指針首先要編譯boost庫,具體方法可以網上查詢,在此不再贅述。

智能指針能夠使C++的開發簡單化,主要是它能夠自動管理內存的釋放,而且能夠做更多的事情,即使用智能指針,則可以再代碼中new了之后不用delete,智能指針自己會幫助你管理內存資源的釋放。

Boost庫的智能指針有很多種,下面通過示例代碼來說明其中share_ptr的使用方法。    

/ test.cpp : Defines the entry point for the console application.#include "stdafx.h"#include <iostream>#include <boost/shared_ptr.hpp>#include <vector> /** 測試類  */class CTest{public:        /**  構造函數 */    CTest(int m)    {        m_member = m;         /** 申請空間 */         m_pname = new char[2];    }    /** 析構函數 */    ~CTest()    {        delete m_pname;    }     /** 成員函數 */     int getMember()    {        return m_member;    } private:     /** 數據成員 */     int m_member;    char * m_pname;   }; int _tmain(int argc, _TCHAR* argv[]){ /** 示例代碼【1】 */      /** boost::shared_ptr智能指針含有一個引用計數器 */     /** 引用指針計數器記錄有多少個引用指針指向同一個對象,如果最后一個引用指針被銷毀的時候,那么就銷毀對象本身。 */      /** 使用智能指針創建一個對象 */    /** 注意: 智能指針不支持直接 new 例如: boost::shared_ptr<CTest> pTemp = new CTest(2) 是錯誤的 */     boost::shared_ptr<CTest> pTemp(new CTest(10));     /** 創建一個新的智能指針也指向新創建的CTest對象 */     /** 智能指針支持等號操作 */     boost::shared_ptr<CTest> pSecond = pTemp;     /** 通過智能指針訪問該對象 */     std::cout << pTemp->getMember() << std::endl;     /** 讓第一個智能指針為空,不再指向該對象,注意,智能指針不能使用 pTemp = NULL */    pTemp.reset();     /** 讓第二個智能指針也為空,這時該CTest對象已經沒有智能指針指向它了,會自動析構 */     pSecond.reset(); /** 示例代碼【2】 */      /** 將一個普通的指針轉換為智能指針 */     /** 創建一個普通的指針,new一個對象 */     CTest * pATest = new CTest(100);    /** 轉換為智能指針 */     boost::shared_ptr<CTest> pShareTest(pATest);     /** 智能指針會自動管理創建的CTest對象,不允許再進行delete,否則程序會掛掉 */     delete pATest;     /** 讓智能指針為空,則對象會被自動析構 */     pShareTest.reset();  /** 示例代碼【3】 */      /** 創建一個容器存放智能指針 */    /** 這里需要注意: 兩個“ > ” 不要寫到一起了,否則會產生 >> 運算符重載  */     std::vector<boost::shared_ptr<CTest> > vec;     /** 創建一個臨時的CTest對象,存放到上面的容器 */      {        /** 使用智能指針創建一個對象 */        boost::shared_ptr<CTest> pTemp(new CTest(2));         /** 添加到容器中 */         vec.push_back(pTemp);         /** 離開大括號,則pTemp析構,于是只有容器中的指針指向了新創建的CTest */     }     /** 讓vector迭代器指向剛剛push_back到容器中的智能指針 */     std::vector<boost::shared_ptr<CTest> >::iterator itor = vec.begin();     /** 訪問智能指針, (*itor)即為智能指針對象,指向了剛才創建的CTest,通過 -> 方法訪問CTest對象  */     std::cout << (*itor)->getMember()<<std::endl;      /** 清空容器,在容器被清空時,容器中的智能指針被刪除,        由于此時已經沒有智能指針指向該對象,故該CTest對象會自動析構 */     vec.clear();     int temp;    std::cin >> temp;      return 0;} /** 使用智能指針需要注意的地方 */  // 1. 智能指針其實是一種類對象,并不是簡單的指針,故當智能指針包含另一個類的對象時,//    需要包含另一個類的頭文件,而不能簡單的使用前向引用聲明// eg: CMyClass.h文件  #include "CTest.h" /** 不能簡單地使用前向引用聲明,必須包含頭文件 */  // 前向引用聲明 class CTest class CMyClass{public: private:    boost::shared_ptr<CTest> m_pTest; }; // 2. shared_ptr 是線程安全的 // 3. 使用智能指針出現循環引用的情況// 即兩個類互相含有對方類對象的智能指針

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 固原市| 拉萨市| 辉县市| 上犹县| 宁武县| 独山县| 锡林郭勒盟| 中江县| 古丈县| 乳山市| 城固县| 错那县| 阳曲县| 霸州市| 凤山县| 淳化县| 湖南省| 宿州市| 肥西县| 天峻县| 福海县| 万盛区| 灵石县| 神农架林区| 梧州市| 军事| 霍山县| 贵州省| 平陆县| 怀来县| 宝应县| 萝北县| 定南县| 珲春市| 当阳市| 温州市| 通山县| 疏勒县| 红安县| 旬阳县| 石河子市|