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
  • 相关阅读:
    [Scala] akka actor编程(一)
    随便说说
    [Java] Java执行Shell命令
    [Scala] Scala基础知识
    [Linux] 账户管理命令(二)
    [Linux] 账户管理命令(一)
    [Kerberos] Java client访问kerberos-secured cluster
    沟通与影响技术培训
    Python
    ML 基础知识
  • 原文地址:https://www.cnblogs.com/Real-Ying/p/12810807.html
Copyright © 2011-2022 走看看