【C++学习】智能指针-shared_ptr

C++智能指针

智能指针简介

C++很多强大的功能依赖指针来实现,然而指针又是最容易出错的,最容易出错的一点就是,当对象已经释放了,再用指针访问其内容,以此造成非法内存访问的错误。
在C++11中,引进了新的智能指针类型,它们用来管理动态对象,智能指针的行为类似于常规的指针,但是,它能够自动的释放所指的对象,以避免内存泄漏,新的标准库中,提供了3种类别的智能指针:
1, shared_ptr //允许多个指针指向同一个对象,
2 , unique_ptr //独占式的指向所指的对象,不能指向相同的对象。
3 , weak_ptr //伴随类,是一种弱引用,指向share-ptr所管理的对象。
这三个类别都存放在
#include< memory >头文件中。

share_ptr类

智能指针式模板,我们必须提供其指向的对象类型。

1.定义智能指针:

share_ptr<string> p1; //定义指向string类型的智能指针。
share_ptr<list<string>> p2; //定义指向string列表类型的智能指针。

默认初始化的智能指针保存着一个空指针,
在条件判断中,使用智能指针,其效果是检测该指针是否为空指针。

2.判断智能指针是否指向空:

share_ptr<string> p1;
if(!p1)
{
    cout<<"p1 is point to null"<<endl;
}

make_shared

1.创建智能指针:

share_ptr<string> p1=make_shared<string>("test share point");//用make_shared<T>模板函数创建智能指针。
//也可以用auto智能指针来保存
auto p2=make_shared<vector<string>>();

引用计数

我们可以认为智能指针所指向的对象都有相对应的一个关联的计数器,称之为引用计数
当我们拷贝一个shared_ptr时,其指向的对象的引用计数会递增,比如:
1.用一个shared_ptr 去初始化另一个shared_ptr指针;
2.将shared_ptr作为参数传给一个函数;
3.将shared_ptr作为函数的返回值;
而在下列的情况下,其引用计数会递减:
1.shared_ptr变量被赋予新值,则它之前指向的对象的引用计数就减一。
2.shared_ptr变量被销毁(如离开作用域),其指向的对象的引用计数也会减一。

当一个shared_ptr变量的引用计数变为0时,它将自动释放自己所指向的对象,而不用我们自己手动释放。

auto a=make_shared<int>(100);//定义智能指针
auto b=make_shared<int>(200);//定义智能指针
b=a;//指针从新指向新的对象。

上面的代码中,因为b指针被赋予新值,所以,它之前所指的对象的引用计算将从1变为0,自动释放其对象,而a所指向的对象的引用计数将从1变为2.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值