zoukankan      html  css  js  c++  java
  • 内存管理之智能指针unique_ptr&weak_ptr

    unique_ptr:

    1.unique_ptr与shared_ptr不同,某个时刻只能有一个unique_ptr指向给定的对象,当unique_ptr被销毁时,其所指向的对象也被销毁,和shared_ptr一样,unique_ptr默认使用delete释放指向的对象
     
    2.unique_ptr初始化
    1.不初始化,返回一个内容为nullptr的unique_ptr
    unique_ptr<类型> 指针名;
    2.使用内置类型指针直接初始化
    unique_ptr<类型> 指针名(内置类型指针p); 这里的p --> 类型* p = new 类型()
    unique_ptr<类型> 指针名(new<类型>())//unique_ptr与new结合使用

    3.unique_ptr独占指向的对象,不支持赋值和拷贝操作

    例子:
    unique_ptr<string> p1(new string("hello,world")); // 正确,直接初始化
    unique_ptr<string> p2(p1); // 错误,unique_ptr不支持拷贝操作
    unique_ptr<string> p3; // 正确,返回一个内容为nullptr的unique_ptr
    p3 = p1; // 错误,unique_ptr不支持赋值操作

    4.了解reset()和release()方法

    虽然不能拷贝或者赋值,但是可以通过reset()和release()方法将指针的所有权从一个unique_ptr转移给另一个unique_ptr
    例子:
    unique_ptr<string> p1(new string("hello,world"));
    unique_ptr<string> p2(p1.release()); // p1将所有权转移给p2,release将p1置空
    unique_ptr<string> p3(new string("hi,china"));
    p3.reset(p2.release()); // p2将所有权转移给p3,reset释放原p3内存,然后重新拥有新的对象的所有权
     
    详细了解:参看c++ primer 5 Edition P418
     
    5.特别之处:传递unique_ptr参数和返回unique_ptr
    unique_ptr不能拷贝或赋值有一个例外,但是可以拷贝或者赋值将要被销毁的unique_ptr
     
    weak_ptr:(弱共享)

    1.weak_ptr不能控制所指向对象的生存期的智能指针,其指向一个shared_ptr管理的对象
     
    2.将weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数
     
    3.当最后一个shared_ptr被销毁,即使有weak_ptr指向该对象,对象也会被销毁
     
    4.weak_ptr初始化:初始化方式和shared_ptr方式一样,而且weak_ptr和shared_ptr之间可以相互初始化,唯一不同的是,weak_ptr的使用要用lock()方法
     
    5.weak_ptr不能直接访问对象,必须使用lock()方法,要检查weak_ptr指向的对象是否存在
  • 相关阅读:
    leetcode刷刷刷
    素数问题
    TCP/IP详解(整理)
    关于区块链应用方向与前景的一些思考
    设计模式
    面经中的各种问题汇总
    基于消逝时间量的共识机制(POET)
    c++语言知识点汇总
    二叉树前中后/层次遍历的递归与非递归形式(c++)
    layui表格搜索数据登录失效后的处理
  • 原文地址:https://www.cnblogs.com/zhang716921/p/10626737.html
Copyright © 2011-2022 走看看