std::shared_ptr是在c++11中引入的一种智能指针,其特点是它所指向的资源具有共享性,即多个shared_ptr可以指向同一份资源。在c++中使用shared_ptr需要包含<memory>头文件。
(一)定义并初始化一个共享指针的三种方式:
1通过new运算符或者普通指针
shared_ptr<Investment> sp(newInvestment());
Investment * pInvestment = new Investment();
shared_ptr<Investment> sp (pInvestment);
2通过make_shared方法
auto sp1 = std::make_shared<Investment>();
3通过拷贝另一个智能指针
shared_ptr<Investment> sp2(sp);
//或者
shared_ptr<Investment> sp3 = sp2;
(二)shared_ptr的结构
通过上图所示的结构,我们可以知道在控制块中有一个引用计数字段(Reference Count),用来记录指向Object的共享指针数量,当我们声明并初始化一个共享指针时,Reference Count的值为1,当有另一个共享指针指向该Object时(比如通过赋值或拷贝构造函数,将一个共享指针赋值给另一共享指针),Reference count 的值递增1。
第二个字段:Weak Count,也是一个引用计数,它用来计数指向该Object的std::weak_ptr指针的数量,关于std::weak_ptr我们将在下一章节讨论。
引用计数的存在使得std::shared_ptr有一些比较特别的特性:
Std::shared_ptr的大小两倍于普通指针。
控制块必须是动态分配的,这是由于被shared_ptr所管理的对象并不知道有“引用计数”的存在,所以在被管理对象中并没有空间来存储这个引用计数。
引用计数的增减必须是原子性的,否则在多线程环境下,由于线程竞争的存在,会导致对Reference count的脏读、脏写。
(三)资源释放
shared_ptr默认情况下使用delete释放资源,但是用户也可以指定自己的资源释放函数,例如在下面这个例子中,pInvest用delete_Investment进行资源释放操作:
资源释放器的地址存放于控制块(Control Block)中,因此增加用户自定义的资源释放器不会增加shared_ptr的大小,其大小仍然为两个指针的大小。
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!