zoukankan      html  css  js  c++  java
  • 智能指针(二):shared_ptr实现原理

    前面讲到auto_ptr有个很大的缺陷就是所有权的转移,就是一个对象的内存块只能被一个智能指针对象所拥有.但我们有些时候希望共用那个内存块.于是C++ 11标准中有了shared_ptr这样的智能指针,顾名思义,有个shared表明共享嘛.所以shared_ptr类型的智能指针可以做为STL容器的元素

    下面我们来瞧瞧shared_ptr具体是咋实现的.相较auto_ptr有下面几个不同的地方:

    1.引进了一个计数器shared_count,用来表示当前有多少个智能指针对象共享指针指向的内存块

    2.析构函数中不是直接释放指针对应的内存块,如果shared_count大于1则不释放内存只是将引用计数减1,只是计数等于1时释放内存

    3.复制构造与赋值操作符只是提供一般意义上的复制功能,并且将引用计数加1.

    shared_ptr实现代码(只实现核心功能)

    #include <iostream>

    using namespace std;

    template<class T>

    class shared_ptr{

    private:

    T* m_ptr; //被封装的指针

    unsigned int shared_count;   //引用计数,表示有多少个智能指针对象拥有m_ptr指向的内存块

    public:

    shared_ptr(T* p):m_ptr(p),shared_count(1){ }

    ~shared_ptr() { deconstruct();}

    void deconstruct(){

    if(shared_count == 1)   //引用计数为1表示只有一个对象使用指针指向的内存块了

    {

    delete m_ptr;

    m_ptr = 0;

    }

    shared_count--;

    }

    T& operator*() { return *m_ptr;}

    T* operator->() { return m_ptr;}

    //复制构造函数

    shared_ptr(shared_ptr& sp):m_ptr(sp.m_ptr),shared_count(sp.shared_count){

    shared_count++;

    }

    //重载运算符=

    shared_ptr& operator = (shared_ptr& sp){

    sp.shared_count++;   

    deconstruct();  //相当于先删掉左值,然后再通过右值赋值.

    m_ptr = sp.m_ptr;

    shared_count = sp.shared_count;

    return *this;

    } 

    };

    使用举例:

    如有类struct Arwen{

    int age;

    Arwen(int gg) :age(gg) { };

    };

    //下面代码全部运行正确

    void main(){

    shared_ptr<Arwen> myPtr( new Arwen(24) );

    int num =myPtr->age;

    shared_ptr<Arwen> ptrOne( myPtr); //复制构造

    num =myPtr->age; //如果是auto_ptr该处会出错.因为把myPtr复制给ptrOne后,它自己本身相当于失效了

    num = ptrOne->age;

    shared_ptr<Arwen> ptrTwo = ptrOne;

    num = ptrOne->age;//如果是auto_ptr该处也会出错,此时ptrOne也失效了

    num = ptrTwo->age;

    return 0;

    }

  • 相关阅读:
    Java 8 Lambda 表达式
    OSGi 系列(十二)之 Http Service
    OSGi 系列(十三)之 Configuration Admin Service
    OSGi 系列(十四)之 Event Admin Service
    OSGi 系列(十六)之 JDBC Service
    OSGi 系列(十)之 Blueprint
    OSGi 系列(七)之服务的监听、跟踪、声明等
    OSGi 系列(六)之服务的使用
    OSGi 系列(三)之 bundle 事件监听
    OSGi 系列(三)之 bundle 详解
  • 原文地址:https://www.cnblogs.com/MrYuan/p/4736570.html
Copyright © 2011-2022 走看看