《Effective Modern C++》item 19: std::shared_ptr

总结过的关于shared_ptr:https://blog.csdn.net/qq_35865125/article/details/88918909 , 有分析如何自己实现shared_ptr。


----shared_ptr出现于c++ 11, 可以有很多很多个shared_ptr对象指向同一个资源(某个类的实例), ,这些shared_ptr

共同拥有这个资源。 优点: 就像是具备垃圾回收功能的语言,客户端不用关系何时去释放资源,同时,何时释放资源又是deterministric:


----shared_ptr的常识:

--使用shared_ptr的注意事项:由于包含一个指向引用计数的指针,其size是裸指针的两倍; 用于存储引用计数

的那块空间(例如一个int型的数)必须是dynamic allocate(存在于堆空间上);   由于多个线程,增加引用计数值的操作必须是原子操作;

------使用move的方式将一个shared_ptr赋值给另一个shared_ptr时,不会导致引用计数的增加:

-----与unique_ptr一样,shared_ptr的默认删除其托管的资源的方式是 delete,用户可以定制删除资源的函数,但是,两者在

定制该函数的时候有一些不同, 定制函数的类型是unique_ptr的一部分,却不是shared_ptr的一部分哦:

-----在custom deleter方面与unique_ptr的另一个不同点是,shared_ptr的size与deleter 函数的大小无关,

无论有没有指定custom deleter函数,其size都是2个指针的大小,其中也给指针指向其托管的对象地址,另一个

指针指向control bolck,该block是一个堆上的空间,包括了引用计数,custom deleter等等:

-----假设有多个shard_ptr对象指向同一个被托管的对象,那么这些shared_ptr对象使用的control block是

相同的,这样才能保证引用计数的有效性哦,鉴于此,使用shared_ptr时必须注意以下的东东,要保证

对于一个 需要被托管的类对象 来说不能有两份control block!!!!!,  注意,尽量不要先new 一个指针变量,然后

再将其传递给shred_ptr的构造函数,这样子相当不规范:

-----在类的成员函数中,将this指针传给shard_ptr的构造函数可能会导致问题,例如,在该成员函数被调用之前

该类对象已经被shared_ptr托管了,这样话就会出现有两个control block为该对象进行引用计数啦:

-----为了避免上述问题必须采取一些措施,这些措施使用起来感觉比较不美观,哈哈, 需要使用

std::enable_shared_from_this模板来创造一个基类:


--------------------------------------------------总结---------------------------------------------------------------------------------------------------

-----一旦你使用了一个shared_ptr去托管一个对象,那么就永远用shared_ptr操作这个对象吧,不能分离!!:

----不存在std::shared_ptr<T[]>


 

---Finally:

发布了341 篇原创文章 · 获赞 87 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_35865125/article/details/103865618