zoukankan      html  css  js  c++  java
  • 智能指针操作

    shared_ptr类


    shared_ptr和unique_ptr都支持的操作:

    操作解释
    shared_ptr<T> sp 
    unique_ptr<T> up
    创建空智能指针,可以指向类型是T的对象
    p p用作一个条件判断,若p指向一个对象,则为true
    *p 解引用p,获得它指向的对象。
    p->mem 等价于(*p).mem
    p.get() 返回p中保存的指针,要小心使用,若智能指针释放了对象,返回的指针所指向的对象也就消失了。
    swap(p, q) 
    p.swap(q)
    交换pq中的指针

    shared_ptr独有的操作:

    操作解释
    make_shared<T>(args) 返回一个shared_ptr,指向一个动态分配的类型为T的对象。使用args初始化此对象。
    shared_ptr<T>p(q) pshared_ptr q的拷贝;此操作会递增q中的计数器。q中的指针必须能转换为T*
    p = q pq都是shared_ptr,所保存的指针必须能互相转换。此操作会递减p的引用计数,递增q的引用计数;若p的引用计数变为0,则将其管理的原内存释放。
    p.unique() p.use_count()是1,返回true;否则返回false
    p.use_count() 返回与p共享对象的智能指针数量;可能很慢,主要用于调试。

    shared_ptr和new结合使用

    定义和改变shared_ptr的其他方法:

    shared_ptr<int> p(new int(42)); //shared_ptr指向一个值为42的int,两者结合使用仅只能以这种形式出现,可用但最好别用

    shared_ptr<int> p = new int(42);//错误,智能指针的构函是explicit的,普通指针不能隐式转化为智能指针,只有上个可用

    使用普通指针访问智能指针所负责对象很危险,因为不知对象何时被销毁可能访问到不存在内存

    不要使用成函get初始化另一个智能指针或为其赋值

    操作解释
    shared_ptr<T> p(q) p管理内置指针q所指向的对象;q必须指向new分配的内存,且能够转换为T*类型 。(即用普通指针初始化智指)
    shared_ptr<T> p(u) punique_ptr u那里接管了对象的所有权;将u置为空
    shared_ptr<T> p(q, d) p接管了内置指针q所指向的对象的所有权。q必须能转换为T*类型。p将使用可调用对象d来代替delete
    shared_ptr<T> p(p2, d) pshared_ptr p2的拷贝,唯一的区别是p将可调用对象d来代替delete
    p.reset() p是唯一指向其对象的shared_ptrreset会释放此对象。若传递了可选的参数内置指针q,会令p指向q,否则会将p置空。若还传递了参数d,则会调用d而不是delete来释放q
    p.reset(q) 同上
    p.reset(q, d) 同上

    unique_ptr


    没有类似make_shared的标准库返回一个unique_ptr,定义时需将其绑定到一个new返回的指针。

    unique_ptr<int> p (new int(42));

    unique_ptr<int> p;

    unique_ptr特有操作:

    操作解释
    unique_ptr<T> u
    unique_ptr<T, D> u2
    unique_ptr,可以指向类型是T的对象。u1会使用delete来是释放它的指针。
    u2会使用一个类型为D的可调用对象来释放它的指针。
    unique_ptr<T, D> u(d) unique_ptr,指向类型为T的对象,用类型为D的对象d代替delete
    u = nullptr 释放u指向的对象,将u置为空。
    u.release() u放弃对指针的控制权,返回指针,并将u置空。
    u.reset() 释放u指向的对象
    u.reset(q) u指向q指向的对象
    u.reset(nullptr) u置空

    删除器的类型D要在创建unique的时候提供,放在<>中的第二个类型用decltype()*提供可调用的函数指针,并在d的位置放入替代delete的函数名称

    ep: unique_ptr<connection, decltype(end_connection)*> p(&c, end_connection);

    weak_ptr


    • 创建一个weak_ptr时要用一个shared_ptr来初始化它。  
      • auto p = make_shared<inr>(42);    weak_ptr<int> wp(p);
    • 由于对象不一定存在所以在访问weak_ptr管理的对象之前必须使用成员函数lock()检查对象是否存在,如果存在则返回指向共享对象的shared_ptr。
      • if(shared_ptr<int> p == wp.lock()) { /*访问管理对象的语句*/}   //p和np共享对象

    weak_ptr操作:

    操作解释
    weak_ptr<T> w weak_ptr可以指向类型为T的对象
    weak_ptr<T> w(sp) shared_ptr指向相同对象的weak_ptrT必须能转换为sp指向的类型。
    w = p p可以是shared_ptr或一个weak_ptr。赋值后wp共享对象。
    w.reset() w置为空。
    w.use_count() w共享对象的shared_ptr的数量。
    w.expired() w.use_count()为0,返回true,否则返回false
    w.lock() 如果expiredtrue,则返回一个空shared_ptr;否则返回一个指向w的对象的shared_ptr
  • 相关阅读:
    Swift3 重写一个带占位符的textView
    Swift3 使用系统UIAlertView方法做吐司效果
    Swift3 页面顶部实现拉伸效果代码
    Swift3 倒计时按钮扩展
    iOS 获取当前对象所在的VC
    SpringBoot在IDEA下使用JPA
    hibernate 异常a different object with the same identifier value was already associated with the session
    SpringCloud IDEA 教学 番外篇 后台运行Eureka服务注册中心
    SpringCloud IDEA 教学 (五) 断路器控制台(HystrixDashboard)
    SpringCloud IDEA 教学 (四) 断路器(Hystrix)
  • 原文地址:https://www.cnblogs.com/Real-Ying/p/12810807.html
Copyright © 2011-2022 走看看