智能指针有两种:shared_ptr和unique_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版