亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

C++智能指針讀書筆記

2020-01-26 14:49:08
字體:
來源:轉載
供稿:網友

最近在補看《C++ Primer Plus》第六版,這的確是本好書,其中關于智能指針的章節解析的非常清晰,一解我以前的多處困惑。C++面試過程中,很多面試官都喜歡問智能指針相關的問題,比如你知道哪些智能指針?shared_ptr的設計原理是什么?如果讓你自己設計一個智能指針,你如何完成?等等……。而且在看開源的C++項目時,也能隨處看到智能指針的影子。這說明智能指針不僅是面試官愛問的題材,更是非常有實用價值。

C++通過一對運算符 new 和 delete 進行動態內存管理,new在動態內存中為對象分配空間并返回一個指向該對象的指針,delete接受一個動態對象的指針,銷毀對象并釋放與之相關的內存。然而這樣的動態內存的使用很危險,因為無法確保始終能在合適的時間釋放內存對象。如果忘記釋放內存,可能造成內存泄露;如果在尚有指針引用內存的情況下釋放內存,會產生非法訪問內存的指針。

C++11中,新的標準庫提供了兩種智能指針(smart pointer)類型來更安全地管理對象。智能指針的使用和常規指針類似,只是它們多了自動釋放所指向的對象的功能。兩種指針的區別在于管理底層指針的方式:shared_ptr允許多個指針指向同一個對象,unique_ptr不支持。標準庫還提供了weak_ptr這一弱指針,指向shared_ptr所管理的對象。三種類型都定義在頭文件memory中。

shared_ptr的使用和vector很相似,在尖括號內說明所指向對象的類型:

復制代碼 代碼如下:
shared_ptr<string> p1              // p1是shared_ptr,指向string類型
shared_ptr<list<int>> p2     // p2是shared_ptr,指向list的int

解引用一個智能指針就能獲得它所指向的對象,在if語句中使用智能指針可以判斷它指向的對象是否為空:

復制代碼 代碼如下:
// 如果p1非空,檢查p1是否指向一個空的string對象
if (p1 && p1->empty())
    *p1 = "creat";        // 如果p1非空且指向一個空的string對象,解引用p1,為其賦新值creat

最安全的分配和使用shared_ptr的方法是調用名為make_shared這一標準庫函數。此函數在動態內存中分配并初始化它,返回指向此對象的shared_ptr。該函數定義在memory中。

make_shared的定義和shared_ptr相似,必須制定要創建對象的類型,如:

// 指向一個值為1的int的shared_ptrshared_ptr<int> p3 = make_shared<int>)(1);// 指向一個值為“www”的string的shared_ptrshared_ptr<string> p4 = make_shared<string>(3, "w");// 指向一個初始化的int,值為0shared_ptr<int> p5 = make_shared<int>)();

也可以使用auto定義對象保存make_shared,可以省去書寫shared_ptr的麻煩。

  shared――ptr中有一個關聯的指示器,稱為引用計數??梢钥醋鲆粋€計數器,每當shared_ptr對象進行拷貝操作,如用一個shared_ptr對象初始化另一個shared_ptr對象、作為函數的實參、作為函數返回值時,引用計數都會遞增(視為數值+1)。當賦予shared_ptr新值或者shared_ptr被銷毀時,引用計數遞減。當引用計數減為0,通過析構函數,shared_ptr自動銷毀所管理的對象,釋放內存。

  需要注意的是,如果多個對象共享底層數據,當某一對象被銷毀,不能單方面銷毀底層數據,例如:

Blob<string> b1;{ // 新作用域  Blob<string> b2 = { "x", "b", "b" };  b1 = b2;}  // 當離開局部作用域,b2被銷毀,然而b2中的元素xbb并不會被銷毀   // b1指向最初由b2創建的元素,即“x”, "b", "b",b1依舊可以它們

  weak_ptr是指向shared_ptr管理的對象的一種智能指針,然而它不控制所指向對象的生存期。將一個weak_ptr綁定在shared_ptr上,不會改變shared_ptr的引用計數,一旦最后一個shared_ptr的指向對象被摧銷毀,對象就會被釋放,有無weak_ptr并無卵影響。我的理解是,weak_ptr提供了指向shared_ptr底層數據的功能,控制了shared_ptr對底層數據的訪問。

  因為weak_ptr指向的對象可能不存在(shared_ptr指向的最后一個對象被銷毀時),因而用它不能直接訪問對象,必須調用lock函數檢查其指向的對象是否存在。很容易寫出一個選擇語句進行控制:

auto bb = make_shared<string>(2, 'b');weak_ptr<string> xbb(bb);if (shared_pr<int> np = xbb.lock()) { // np不為空條件成立  // 在if語句內,np和xbb共享對象  }

補充weak_ptr相關的函數,便于理解:

w.reset 將w置為空
w.use_count() 與w共享對象的個數
w.expired() 若w.use_count()為0,返回true,否則返回false
w.lock() 若w.expired()為true,返回一個空shared_ptr,否則返回一個指向w的對象的shared_ptr

加入《C++ Primer 5th》中的12.19題參照,題中和“智能指針和異?!辈⑽丛诒酒S筆中介紹

#include <iostream>    #include <string>#include <vector>#include <memory>#include <initializer_list>using namespace std;using std::string;using std::vector;class StrBlobPtr;class StrBlob {public:  friend class StrBlobPtr;      // 友元  StrBlobPtr begin();         // 聲明StrBlob類中的begin()和end()  StrBlobPtr end();          // 返回一個指向它自身的StrBlobPtrpublic:  typedef vector<string>::size_type size_type;  // 類型別名,size_type = vector<string>::size_type  StrBlob::StrBlob(initializer_list<string> il) : data(make_shared<vector<string>>(il)) {};  // 接受一個initializer_list參數的構造函數將其參數傳                                                            遞給對應的vector構造函數,通過拷貝列表  StrBlob::StrBlob() : data(make_shared<vector<string>>()) {};                 // 構造函數,初始化data成員,指向動態分配的vector                                                            中的值初始化vector元素  void push_back(const string &t) { data->push_back(t); }  string& StrBlob::front() {    check(0, "front on empty StrBlob");    return data->front();  }  string& StrBlob::back() {    check(0, "back on empty StrBlob");    return data->back();  }  void StrBlob::pop_back() {             // 刪除尾元素    check(0, "pop_back empty StrBlob");    return data->pop_back();  }  string& front() const { return data->front(); };  string& back() const { return data->back(); };private:  shared_ptr<vector<string>> data;  void StrBlob::check(size_type i, const string &msg) const {  // 檢查元素是否存在    if (i >= data->size())                  // 若不存在      throw out_of_range(msg);               // 拋出異常  }};class StrBlobPtr {public:  StrBlobPtr() : curr(0) {};  StrBlobPtr(StrBlob &a, size_t sz = 0) : wptr(a.data), curr(sz) {};  string & deref() const {    auto p = check(curr, "dereference past end");    return (*p)[curr];  // check成功,返回一個p指針,指向make_shared指向的vector  }            // 解引用,make_shared獲取vector,用下表運算符返回curr位置上的對象  StrBlobPtr& incr() {    check(curr, "increment past end of StrBlobPtr");    ++curr;    return *this;  }  bool operator!=(const StrBlobPtr& p) { return p.curr != curr; }private:  weak_ptr<vector<string>> wptr;  size_t curr;  shared_ptr<vector<string>> check(size_t i, const string& msg) const  {    auto rent = wptr.lock();    if (!rent)      throw runtime_error("unbound StrBlobPtr");    if (i >= rent->size())      throw out_of_range(msg);    return rent;  }};StrBlobPtr StrBlob::begin(){  return StrBlobPtr(*this);}StrBlobPtr StrBlob::end(){  return StrBlobPtr(*this, data->size());}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩女优在线播放| 日韩中文字幕网址| 欧美另类高清videos| 色偷偷噜噜噜亚洲男人的天堂| 中文字幕av一区中文字幕天堂| 精品亚洲一区二区三区四区五区| 日韩av电影在线免费播放| 成人欧美一区二区三区在线| 久久人人爽人人爽人人片亚洲| 91高潮在线观看| 最近更新的2019中文字幕| 亚洲精品成人网| 国产成人福利网站| 欧美日韩午夜视频在线观看| 97成人精品区在线播放| 国产精品白丝av嫩草影院| 日韩欧美在线视频观看| 欧美另类精品xxxx孕妇| 在线激情影院一区| 91中文字幕在线观看| 久久99精品久久久久久琪琪| 国产精品视频资源| 国产精品免费小视频| 久久国产精品99国产精| 国产精品美女网站| 久久精品视频免费播放| 欧美洲成人男女午夜视频| 欧美精品少妇videofree| 欧美劲爆第一页| 亚洲第一在线视频| 国内精品久久久久久中文字幕| 日韩美女视频在线观看| 亚洲qvod图片区电影| 欧美日韩亚洲天堂| 欧美在线一级va免费观看| 久久精品欧美视频| 不卡av在线网站| 深夜精品寂寞黄网站在线观看| 欧美一级高清免费| 国产亚洲aⅴaaaaaa毛片| 国产精品高精视频免费| 久久久久久久久中文字幕| 欧美日韩亚洲视频| 中文字幕亚洲激情| 青青草成人在线| 精品国产电影一区| 久久亚洲精品国产亚洲老地址| 久久99亚洲热视| 国产精品久久一区主播| 欧美大码xxxx| 亚洲国产成人久久综合| 在线国产精品视频| 欧美午夜激情小视频| 久久在线免费视频| 日本久久精品视频| 欧美在线视频导航| 日韩欧美主播在线| 正在播放欧美一区| 久久久免费av| 欧美日本高清视频| 欧美激情视频一区| 欧美日韩在线一区| 国产精品一区二区三| 成人欧美一区二区三区黑人孕妇| 国产区亚洲区欧美区| 欧美精品免费在线观看| 国产免费一区二区三区在线能观看| 亚洲理论在线a中文字幕| 97av在线播放| 午夜免费在线观看精品视频| 国产欧洲精品视频| 人人爽久久涩噜噜噜网站| 亚洲成人国产精品| 91免费精品国偷自产在线| 午夜精品三级视频福利| 美日韩丰满少妇在线观看| 色偷偷av一区二区三区乱| 欧美激情视频一区二区三区不卡| 国产一区二区久久精品| www.欧美精品一二三区| 成人免费xxxxx在线观看| 伊是香蕉大人久久| 欧美日韩在线免费| 欧美激情视频在线| 亚洲精品suv精品一区二区| 国产亚洲一区精品| 日本久久久a级免费| 欧美激情视频给我| 亚洲欧洲黄色网| 9.1国产丝袜在线观看| 91久久精品日日躁夜夜躁国产| 欧美精品18videosex性欧美| 欧美一级视频在线观看| 国产精品h在线观看| 欧美亚洲成人精品| 日韩av最新在线观看| 91福利视频网| 久久777国产线看观看精品| 国产精品va在线| 日韩视频在线一区| 这里只有精品在线播放| 日本免费在线精品| 中文字幕视频在线免费欧美日韩综合在线看| 成人黄色在线播放| 国产精品麻豆va在线播放| 日韩电影免费在线观看| 亚洲aa在线观看| 亚洲精品福利视频| 亚洲福利在线播放| 欧美做受高潮电影o| 日韩福利在线播放| 日韩精品在线第一页| 国产精品精品久久久久久| 日韩性生活视频| 北条麻妃一区二区三区中文字幕| 国产精品高清在线| 亚洲欧美日韩国产成人| 国产乱人伦真实精品视频| 国产精品高潮呻吟久久av黑人| 国产精品91久久久久久| 国产97在线观看| 久久久久久18| 亚洲成人999| 亚洲欧美国产精品va在线观看| 欧美理论电影网| 成人性生交大片免费观看嘿嘿视频| 国产成人精品亚洲精品| 久久九九全国免费精品观看| 国内精品久久久久久影视8| 中文字幕国产精品久久| 久久99国产综合精品女同| 亚洲字幕一区二区| 91在线色戒在线| 98精品国产高清在线xxxx天堂| 亚洲精品一区中文字幕乱码| 欧美性猛交xxxx黑人猛交| 日韩欧美精品中文字幕| 一区二区三区视频免费在线观看| 国产日韩欧美在线播放| 亚洲a级在线观看| 久久久亚洲影院| 国产精品第8页| 日韩一区二区三区国产| 国产99久久精品一区二区| 久久伊人精品一区二区三区| 在线视频亚洲欧美| 亚洲偷欧美偷国内偷| 亚洲97在线观看| 亚洲女人天堂av| 色999日韩欧美国产| www.亚洲一二| 91av国产在线| 欧美日韩亚洲精品内裤| 久久久这里只有精品视频| 91老司机在线| 亚洲性无码av在线| 国产精品老女人视频| 91高潮在线观看| 精品国产精品三级精品av网址| 日韩av影院在线观看| 亚洲www永久成人夜色| 久久免费视频这里只有精品| 亚洲视频网站在线观看| 久久久影视精品|