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

    笑谈c++智能指针

    c++的一切都是类或模板类, 万变不离其宗. 智能指针也是类,模板类. 不同的智能指针,就对应了不同的类实现了, 但是它们都利用了类对象有释放的时候会调用析构函数的原理. C++有以下几种智能指针:

    • auto_ptr : c++11之后就弃用了.
    • unique_ptr : 它代替了auto_ptr的位置.
    • shared_ptr : 它是不错, 但是用多了它,用效率问题的.
    • weak_ptr : 弱指针, 与shared_ptr配套使用, 它不会增加shared_ptr的引用计数.

    auto_ptr

    在c++11之后,它被弃用了,原因就是因为当把一个auto_ptr对象赋值给另一个变量时, 原有的对象的指针就为空了. 我们很容易实现它:

    1. 在析构函数中释放它管理的指针.
    2. 重载一个赋值运算符,处理一个赋值操作.

    unique_ptr

    unique_ptr与auto_ptr基本相似,有一点不一样: unique_ptr很聪明,它不允许拷贝构造也不允许赋值操作,只允许移动构造和移动赋值操作. 所以实现它也很容易:

    1. 把拷贝构造函数与赋值操作符定义为deleted, 定义移动构造函数与移动赋值操作符.
    2. ......(很常规的其它实现了)

    其它:

    • 构造该对象时,优先使用make_unique_ptr函数(c++14引用的), 异常安全.
    • 初始化时,可以指定删除器.

    shared_ptr

    它允许多个shared_ptr对象共享一块内存, 与前两者有所不同. 本质是就是维护一个内存块的引用计数,引用计数什么时候变为0了,什么时候释放内存. 有几个注意点:

    1. 它的实现效率不如unique_ptr, 所以呢, 在使用权很明确时优先使用unique_ptr.
    2. 使用时避免循环引用的情况.

    其它:

    • 构造该对象时,优先使用make_shared_ptr函数(c++11引用的), 异常安全.
    • 初始化时,可以指定删除器.

    weak_ptr

    它依附于share_ptr而活着, 请使用share_ptr或weak_ptr对象对它进行初始化. 生成一个weak_ptr对象不会增加share_ptr对象内的引用计数,所以是weak. 使用它时,一定要判断一下它指向的shared_ptr对象是否还存在(使用lock成员函数),然后再使用.


    结束语

    最后, 使用智能指针时,有一些坑,这里不想写了. 反正你明白了智能指针的本质,这些坑你就足踩不中了.

  • 相关阅读:
    JavaScript HTML DOM 事件监听器
    点击 和 松开鼠标 触发函数
    当鼠标移动过来 or 鼠标移开 触发函数
    onchange 事件(当焦点不在input框触发函数 )
    把2张表的数据合并成一张表
    Dome操作
    字典里面 值对应是函数的用法
    全局变量和局部变量的问题
    try catch finally 捕获异常的方法
    js 正则
  • 原文地址:https://www.cnblogs.com/yinheyi/p/13620043.html
Copyright © 2011-2022 走看看