zoukankan      html  css  js  c++  java
  • C++11之智能指针

    1、关于智能指针的理解

      1)智能指针是使用RAII技术(资源的获取即初始化)对普通指针进行封装得到的,其实质是一个指针,使用起来像指针。

      2)智能指针可以用来解决程序员忘记使用delete释放内存从而导致内存泄漏,或者多次释放同一块内存,以及当程序出现异常时进入catch块中导致内存忘记释放。

      3)智能指针还可以将值语义转换成引用语义。

    2、智能指针的使用(智能指针有三个:shared_ptr、unique_ptr、weak_ptr,放在头文件的memory里)

      1)由于智能指针是C++11标准下的boost库中的,而boost库是对STL的扩展,所以智能指针也是属于模板类,需要指定类型,传入的指针可以使用构造函数或者使用make_shared函数进行初始化。

      2)shared_ptr内部有一个计数器,每次使用,引用计数加一,析构的时候引用计数减一,当引用计数为0时,释放分配的堆内存,因此shared_ptr为多个指针指向相同的对象。

      3)拷贝操作会使引用计数加一,赋值操作会使引用减一,同理当引用计数为0时,自动释放内存,若内存释放完后,又让智能指针指向新的对象,那么引用计数加一,指向新对象。

      4)get函数可以用来获取原始指针。

      5)若一个指针同时用多个shared_ptr进行封装,会出现多次释放同一个内存的操作。

      6)避免循环引用,循环引用会导致堆内存无法释放。

      7)unique_ptr智能指针同一个时刻只能有一个指针指向对象,也就是说只能有一个指针拥有对象,在出现异常的情况下,动态资源能得到释放。其具有生命周期,从创建开始到离开作用域结束,此时释放指向的对象,并且在作用域内可以修改其指向的对象,不允许拷贝与赋值,因为是指针同一时刻独占这个对象,可以通过移动语义move来实现,或者reset重新进行指定,也可以使用Release来释放其所有权。

      8)weak_ptr智能指针是用来与shared_ptr指针配合使用的,不具有普通指针的行为,没有重载操作符*和操作符->,用来观测shared_ptr资源,可以通过一个shared_ptr对象或者另一个weak_ptr对象构造,从而获得资源观测的权限。可以通过use_count函数来返回观测的资源的引用计数,还可以通过expired()函数来判断观测的资源是否存在,比前者要来的快,还可以通过使用其成员函数lock()来获得被观测的对象,从而操作资源。当观测的资源不存在时,返回一个存放空指针shared_ptr.

  • 相关阅读:
    Fiddler无法抓取HTTPS的问题,Fiddler证书无法安装终极解决方案,
    锤子手机做appium自动化测试时,运行脚本总是弹出警告框的问题
    jmeter4+win10+jdk1.8环境下,jmeter输入中文就卡死的问题
    jenkins构建邮件自动发送,测试邮件发送成功,构建项目邮件发送不成功的问题
    Jenkins安装部署
    Appium中wait_activity的使用以及XPATH定位
    Appium连接夜神模拟器,模拟手势点击(tap)
    Appium如何查看webview上元素
    Appium启动淘宝APP,输入搜索内容
    Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't
  • 原文地址:https://www.cnblogs.com/Dark-King/p/9784814.html
Copyright © 2011-2022 走看看