再探 智能指針

      網友投稿 788 2025-03-31

      使用任何一項工具,都需要承擔代價與風險的。


      1、一個裸的指針不要用兩個shared_ptr管理,unique_ptr也是,它們都會認為自己獨占這個資源,你等釋放的時候試試看。

      2、用weak_ptr打破循環引用。

      3、當需要在類的內部接口中,如果需要將this作為智能指針來使用的話,需要用該類派生自enable_shared_from_this。

      enable_shared_from_this和shared_from_this在構造和析構中是不能使用的,在某些情況下也不能使用,因為構造的時候類還未生成好,析構的時候類快完蛋了都沒有意義。

      #include #include #include class Parent; typedef std::shared_ptr ParentPtr; typedef std::weak_ptr WeakParentPtr; class Child : public std::enable_shared_from_this { public: WeakParentPtr father; ~Child(); Child(); void checkRelation(); }; typedef std::shared_ptr ChildPtr; typedef std::weak_ptr WeakChildPtr; class Parent : public std::enable_shared_from_this { public: WeakChildPtr son; ~Parent(); Parent(); void checkRelation(); }; void handleChildAndParentRef(const Parent& p, const Child& c) { auto cp = c.father.lock(); auto pc = p.son.lock(); if (cp.get() == &p && pc.get() == &c) { std::cout << "right relation\n"; } else { std::cout << "oop!!!!!\n"; } } void handleChildAndParent(const ParentPtr& p, const ChildPtr& c) { auto cp = c->father.lock(); auto pc = p->son.lock(); if (cp == p && pc == c) { std::cout << "right relation\n"; } else { std::cout << "oop!!!!!\n"; } } Child::Child() { std::cout << "hello child\n"; } Parent::Parent() { std::cout << "hello parent\n"; } Child::~Child() { std::cout << "bye child\n"; } Parent::~Parent() { std::cout << "bye parent\n"; } void Parent::checkRelation() { auto ps = son.lock(); if (ps) { // this handleChildAndParent(shared_from_this(), ps); } std::cout << "after call checkRelation\n"; } void Child::checkRelation() { // we call handleChildAndParent } void testParentAndChild() { Parent pp; ParentPtr p(new Parent()); ChildPtr c(new Child()); p->son = c; // c.use_count() == 2 and p.use_count() == 1 c->father = p; // c.use_count() == 2 p.use_count() == 2 p->checkRelation(); } int main() { testParentAndChild(); }

      4、shared_ptr,weak_ptr和裸指針相比會大很多,并且效率上會有影響,尤其是在多線程模式下。

      關于這點自己實現一個智能指針就知道了。

      一個shared_ptr在空間上至少是三個裸指針的大小(24個字節),本身有引用還要配合weak_ptr使用所以要保存多少該指針的引用。如下生成既有對象的new還有本身的new:

      ObjectPtr obj3(new Object(2));

      ObjectPtr obj4 = obj3進行拷貝時時間效率會慢很多

      可以用以下方式減少空間

      ObjectPtr obj5 = std::make_shared(3); //ObjectPtr obj5(new Object(3));

      5、如果有可能,優先使用類的實例,其次萬不得已使用std::unique_ptr,再萬不得已使用std:shared_ptr。

      用unique_ptr和用shared_ptr一樣為了防止處理某些異常時無法調用delete釋放資源的情況,在同一個特定的時刻只會有一個unique_ptr來管理一份資源沒有共享模式,所以拷貝構造函數,=符號拷貝操作等是不存在的。

      由于unique_ptr的唯一性所以要轉移資源可以transfer傳值,只能調用obj的右值引用而不能用左值,transfer函數執行完就釋放了,調用了transfer后原有的會變成空指針不再管理。

      #include #include #include typedef int Object; typedef std::unique_ptr UniqueObjectPtr; typedef std::shared_ptr SharedObjectPtr; void print(const UniqueObjectPtr& obj) {} void transfer(UniqueObjectPtr obj) { std::cout << obj << std::endl; } void uniquePtr() { UniqueObjectPtr obj(new Object(1)); auto p = obj.get(); // operator bool if (p) { std::cout << p << std::endl; } // better if (obj) { std::cout << obj << std::endl; } // operator -> * std::cout << p << obj << std::endl; p = obj.release(); delete p; obj.reset(); obj.reset(new Object(2)); // obj.reset(); // UniqueObjectPtr(const UniqueObjectPtr&) = delete // UniqueObjectPtr(UniqueObjectPtr&&) = default transfer(std::move(obj)); assert(obj == nullptr); //std::cout << obj->id() << std::endl; obj.reset(new Object(4)); SharedObjectPtr sharedObj(std::move(obj)); assert(obj == nullptr); // shared_ptr weak_ptr enable_shared_from_this // unique_ptr }

      6、智能指針只能表示所有權,如果遇到某些復雜的數據結構,或者所有權不明確的場景,還是得裸指針來。

      也很好舉例,用智能指針寫個二叉樹試試。

      再探 智能指針

      好了就說到這兒吧,再說多了怕是以后都不敢用了。

      今天之所以要寫這么一篇,是最近看智能指針的好處被吹的天花亂墜的讓我都有點想把以前裸指針的代碼全改成智能指針了。

      但是呢,不要忘了我們開頭的那句話哦。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel2010中,如果需要提取字符串的第一個詞
      下一篇:word中表格線有粗有細怎么設置(word表格中的線有的粗有的細怎么辦)
      相關文章
      久久精品国产亚洲AV大全| MM1313亚洲精品无码久久| 国产亚洲午夜高清国产拍精品| 久久亚洲精品国产精品婷婷| 亚洲免费观看在线视频| 亚洲黄色在线观看| 亚洲精品在线观看视频| 亚洲精品在线观看视频| 久久亚洲精品无码aⅴ大香| 亚洲av日韩av不卡在线观看| 亚洲电影免费在线观看| 亚洲一区中文字幕久久| 91亚洲国产成人精品下载| 亚洲最新永久在线观看| 亚洲综合在线成人一区| 亚洲成人免费在线观看| 亚洲婷婷第一狠人综合精品| 国产亚洲精aa在线看| 亚洲精品av无码喷奶水糖心| 久久亚洲精品成人无码| 无码不卡亚洲成?人片| 亚洲精品无码久久不卡| 中文字幕亚洲不卡在线亚瑟| 亚洲精品无码午夜福利中文字幕| 亚洲精品~无码抽插| 久久久亚洲欧洲日产国码农村| 亚洲一区二区影院| 亚洲狠狠狠一区二区三区| 2020年亚洲天天爽天天噜| 亚洲人片在线观看天堂无码| 国产亚洲精品免费| 久久久久亚洲精品男人的天堂| 国产亚洲高清不卡在线观看| 久久亚洲私人国产精品vA| 亚洲伊人久久大香线蕉在观| 亚洲日韩一区二区一无码| 亚洲国产成人五月综合网| 国产亚洲精品美女久久久| 91在线亚洲精品专区| 国产精品亚洲精品观看不卡| 国产精品亚洲专区无码WEB|