跳转至

Smart Pointers

智能指针的行为类似于常规指针,重要的区别是它负责自动释放所指向的对象

新标准库提供的两种智能指针的区别在于管理底层指针的方式: - std::shared_ptr:允许多个指针指向同一个对象 - std::unique_ptr:独占所指向的对象 - std::weak_ptr:伴随类,弱引用,指向std::shared_ptr所指向的对象,但不拥有它

1. std::shared_ptr

类似vectorstd::shared_ptr是一个模板类

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

默认初始化的智能指针中保存着一个空指针

智能指针的使用方法与普通指针类似,解引用一个智能指针返回它所指向的对象。如果在一个条件判断中使用智能指针,效果就是检测它是否为空

if(p1 && p1->empty()){
    *p1 = "hi";
    }

shared_ptrunique_ptr都支持的操作

  • shared_ptr<T> p``unique_ptr<T> p:空智能指针,可以指向类型为T的对象
  • p: 将p作为一个条件判断,若p指向一个对象,则为真
  • *p: 解引用,返回p所指向的对象
  • p->mem: 等价于(*p).mem
  • p.get(): 返回p中保存的指针,要小心使用,若智能指针释放了其对象,返回的指针所指的对象也消失了
  • swap(p,q): 交换pq中的指针 p.swap(q)也可以

shared_ptr独有的操作: - make_shared<T>(args...): 返回一个shard_ptr,指向一个动态分配的类型为T的对象,args是传递给T的构造函数的参数 - shared_ptr<T>p(q): pshared_ptr q的拷贝,此操作会递增q中的计数器,q中的指针必须能转化为T* - p=q: pq都是shared_ptr,所保存的指针必须能够相互转换,此操作会递减p的引用次数,递增q的引用次数,若p的引用次数变为0,p所指向的对象会被释放 - p.unique(): 返回p的引用计数器是否为1 - p.use_count(): 返回与p共享对象的智能指针数量