C++学习笔记之shared_ptr指针

智能指针有两种:shared_ptrunique_ptr,所谓“智能”,是说它们负责自动释放所指向的对象。

两种智能指针的主要区别:shared_ptr允许多个指针指向同一个对象,而unique_ptr独占一个对象。

(标准库还定义了一个weak_ptr的伴随类,指向shared_ptr所管理的对象)

shared_ptr实际上是个类模板,需要提供模板实参使之成为一个类。默认初始化的智能指针保存着一个空指针。

shared_ptr<int> p1;
shared_ptr<string> p2;


  • 用make_shared函数分配内存

shared_ptr<int> p3=make_shared<int>(42);
shared_ptr<int> p4=make_shared<string>(10,'9');
shared_ptr<int> p5=make_shared<int>();
使用auto简化声明:

auto p6=make_shared<int>();

注意它是个动态指针,以下这样是不对的:

int a=42;
shared_prt<int> p=make_shared(a);


  • shared_ptr的计数器

当进行拷贝或赋值时,每个shared_ptr都会记录有多少个其他shared_ptr指向同一个对象:


auto p=make_shared<int>(42); //42只有p这一个引用者
auto q(p); //现在42有p和q两个引用者

每个shared_ptr关联着一个计数器,称为引用计数(reference count)

以下操作使计数递增:对shared_ptr进行拷贝

以下操作使计数递减:给shared_ptr赋新值或shared_ptr被销毁(如离开定义它的作用域,实际是直接递减至0)

当shared_ptr计数为0时,它会自动释放自己管理的对象。

//42有两个引用者:p1、p2
auto p1=make_shared<int>(42); 
auto p2(p1);
//43也有两个引用者:q1、q2
auto q1=make_shared<int>(43); 
auto q2(q1);
//现在42有3个引用者:p1、p2、q1,43只有1个引用者q2
q1=p1;

当指向一个对象的最后一个shared_ptr被销毁时,该对象会被销毁(通过析构函数),该对象所占内存会被释放。


参考资料:《C++ Primer》第5版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值