C++智能指针类

//本文内容,来自 《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

2、常用操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章