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

    shared_ptr:计数的智能指针

    它是一个包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针 ,可以被自由地拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。shared_ptr也可以安全地放到标准容器中,并弥补了auto_ptr因为转移语义而不能把指针作为STL容器元素的缺陷。

    线程安全性:

        shared_ptr 本身不是 100% 线程安全的。它的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档,shared_ptr 的线程安全级别和内建类型、标准库容器、string 一样,即:

    • 一个 shared_ptr 实体可被多个线程同时读取;
    • 两个的 shared_ptr 实体可以被两个线程同时写入,“析构”算写操作;
    • 如果要从多个线程读写同一个 shared_ptr 对象,那么需要加锁。

    shared_ptr是线程安全的,这个意思并不是说你可以安全地在多个线程中同时操作同一个shared_ptr<T>变量,而是说你可以把一个shared_ptr赋值给两个变量,分别被两个线程使用。虽然是两个变量,但它们指向同一个对象,拥有同一个引用计数,这里shared_ptr保证这个引用计数能够正常工作,不会混乱,不会少加一,也不会少减一,仅此而以。

    它不保证存储它的变量可以并发访问,这应该由它的使用者保证;它也不保证它存储的对象可以并发访问,这要由对象本身负责,它只保证一点,就是它的引用计数操作是原子操作。shared_ptr只是内部的引用计数是线程安全的.

    shared_ptr缺点:http://blog.csdn.net/henan_lujun/article/details/8984543

    1.避免对shared_ptr所管理的对象的直接内存管理操作,以免造成该对象的重释放   
    2.shared_ptr并不能对循环引用的对象内存自动管理(这点是其它各种引用计数管理内存方式的通病)。注:其实就是交叉引用  

        交叉引用概述和解决方法::weak_ptr解决shared_ptr环状引用所引起的内存泄漏
    3.不要构造一个临时的shared_ptr作为函数的参数。(抛弃临时对象,让所有的智能指针都有名字,就可以避免此类问题的发生)

    使用注意事项:

    void test()
    {
    fun(boost::shared_ptr<Int>(new Int()).g());
    }

    有缺陷 //可能的过程是先new int,然后调g(),g()发生异常,shared_ptr没有创建,int内存泄露 


    //正确的用法为:
    void test()
    {
    boost::shared_ptr<Int> spInt(new Int());
    fun(spInt.g());
    }

  • 相关阅读:
    [每周心学]先生王阳明何许人也?
    CET-6 分频周计划生词筛选(番外篇:百词斩)
    CET-6 分频周计划生词筛选(Week 3)
    架构之美阅读笔记三
    架构之美阅读笔记二
    架构之美阅读笔记一
    软件需求分析课堂讨论01
    问题账户需求分析
    2016年秋季个人阅读计划
    个人总结
  • 原文地址:https://www.cnblogs.com/kkshaq/p/4430349.html
Copyright © 2011-2022 走看看