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

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
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
6、智能指針只能表示所有權,如果遇到某些復雜的數據結構,或者所有權不明確的場景,還是得裸指針來。
也很好舉例,用智能指針寫個二叉樹試試。

好了就說到這兒吧,再說多了怕是以后都不敢用了。
今天之所以要寫這么一篇,是最近看智能指針的好處被吹的天花亂墜的讓我都有點想把以前裸指針的代碼全改成智能指針了。
但是呢,不要忘了我們開頭的那句話哦。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。