//本文内容,来自 《C++ Primer》中文版,第五版
一、shared_ptr类
1、初始化
shared_ptr<string> p1;
e.g
if(p1 && p1->empty()) *p1="hi";
shared_ptr<list<int>> p2;
2、支持的操作
- p //将p用作一个条件判断,如果其指一个对象,则为true
- *p //获取其指向的对象
- p->mem //等价于 (*p).mem
- p.get() //返回p中保存的指针
- swap(p,q) //交换p,q
- p.swap(q)
- make_shared<T> (args) //返回一个shared_ptr,指向一个动态分配的类型为T的对象。并且用args初始化该对象
e.g
share_ptr<int> p3 = make_shared<int> (42);
shared_ptr<string> p4 = make_shared<string>(10, '9');
shared_ptr<int> p5 = make_shared_ptr<int>(); //*p5值为0
- make_shared<T> p(q) //p 是 shared_ptr q的拷贝;此操作会使q的计数器递增;(q中的指针,必须能够转换为T*)
- p = q //p和q必须都是shared_ptr,并且所保存的指针必须能相互转换;p的引用计数会减1;q的引用计数会加1
- p.unique() //若p.use_count()为1;则返回true;否则返回false;
- p.use_count() //返回与p共享对象的智能指针数量;可能很慢,主要用于调试
3、shared_ptr的赋值与拷贝
- auto p = make_shared<int> (42); //此时,p对象,只有p一个引用者
- auto q(p); //p和q指向相同对象;此时,该对象有两个引用者
- auto r = make_shared<int>(42); //此时,r指向的int只有一个引用者
- r = q; //给r赋值,令他指向另一个地址
//q的引用计数递增
//r的引用计数递减;递减后,r没有引用者了,内存会自动释放
4、注意事项
二、unique_ptr类
1、基本概念
它持有对对象的独有权,即两个 unique_ptr 不能指向一个对象,不能进行复制操作只能进行移动操作。
std::unique_ptr<char>p1(new char('a'));
std::unique_ptr<int>p2=p1; // 编译时会报error
std::unique_ptr<int>p3=std::move(p1); // 转移所有权, 现在那块内存归p3所有, p1成为无效的针.
p3.reset(); //释放内存.
p1.reset(); //由于p3已经释放,所以p1的释放没意义
2、常用操作
//所有权从p1转移给p2
unique_ptr<string> p2(p1.release());//release后p1为空
unique_ptr<string>p3(new string("Trex"));
//将所有权从p3转移到p2
p2.reset(p3.release());//reset释放了p2原来指向的内存空间,指向p3的内存空间,在release后p3为空
三、weak_ptr类
1、基本概念
weak_ptr是一种不控制所指向对象生存期的智能指针,它指向一个由shared_ptr管理的对象,将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放,即使有weak_ptr指向对象,对象还是会被释放。
weak_ptr的操作
weak_ptr的作用:
weak_ptr是为配合shared_ptr而引入的一种智能指针来协助shared_ptr工作,它可以从一个shared_ptr或另一个weak_ptr对象构造,它的构造和析构不会引起引用记数的增加或减少。没有重载*和->但可以使用lock获得一个可用的shared_ptr对象
引用计数有一个问题就是互相引用形成环,这样两个指针指向的内存都无法释放。需要手动打破循环引用或使用weak_ptr。顾名思义,weak_ptr是一个弱引用,只引用,不计数。如果一块内存被shared_ptr和weak_ptr同时引用,当所有shared_ptr析构了之后,不管还有没有weak_ptr引用该内存,内存也会被释放。所以weak_ptr不保证它指向的内存一定是有效的,在使用之前需要检查weak_ptr是否为空指针。
环的形成与解决过程可参考:https://blog.csdn.net/Tokyo_2024/article/details/80097272