shared_ptr(一)

普通指针与分享指针

普通指针的操作

解引用:

int ptr = new int{};

*ptr; //解引用

//------------------------

class Test{
public:
    int _value;
};

Test* test = new Test{};

test->_value;   //间接引用操作符

和pod类型的“拷贝构造函数”,与“赋值构造函数”进行浅拷贝。

还有两个个“自身属性”即指针即为变量内存地址和空指针

分享指针提供我们哪些操作?

分享指针提供给我们与指针相关的操作:

构造上分享指针提供了一些与指针相关的操作:

这里写图片描述

1,5:即构建新的分享指针,我们可以看到这两个构造函数均被constexpr修饰。
9:是拷贝构造函数(非const)
10:分享指针为我们提供了移动构造函数,这样我们在函数的返回时一般可以直接返回shared_ptr<_type>


分享指针通过重载*操作符和->操作符,来模拟指针的解引用。

这两个函数均为const修饰的成员函数,这样我们就可以在const shared_ptr<_type>下来访问分享指针中所保存的指针成员了。


get函数提供给我们获取存储对象地址的能力,同样它被const所修饰。


以上就是shared_ptr和指针的相同之处,因此分享指针是具有指针一切能力的。所以分享指针可以当作指针用。

那么分享指针与普通指针有哪些不同呢?

分享指针解引用时,返回的对象是无任何修饰符的引用或指针,也就是无论分享指针是否被const修饰的指针修饰其返回值均可调用非const的函数。

那么被const修饰的分享指针不可以进行哪些操作呢。不可以获取所存对象地址,也就是说不能进行get操作,但是如果你强制的获取对象地址也是可以的通过重载的*的获取存储对象,再通过memory头文件中的addressof<_TY>来获取存储对象的真正地址,但是这样就违背了分享指针设计的本意了,所以不建议这样做。

因为不能够获取对象地址则我们就不能改变对象的地址,因此赋值构造函数和reset方法是不能够被调用的。

我们要避免这种行为-避免通过已有interface去实现已有interface的功能。

那么分享指针具备哪些普通指针不具备的功能?

7, 针对数组的空指针,或针对特定资源的空指针,提供相应的delete操作,这里的delete指的是“不能被系统自动回收的资源进行回收的操作”,提供相应的资源分配操作。

8,这个比较重要下一节我会单独说。

9,有两个9的原因一个是相同类型一个是针对继承说进行的拷贝构造函数

10, 两个10也是一样,一个是相同类型一个是针对继承说进行的移动构造函数

11,由weak_ptr创建分享指针。不能隐式调用。

12,13,分别由auto_ptr和weak_ptr对share_ptr进行构造。

其他操作:

这里的 owner_before 很重要,也会再下一节记录。

分享指针与多线程

参考:
shared_ptr-c++reference
为什么多线程读写要加锁?-陈硕的blog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值