智能指针之shared_ptr框架源码剖析

本文剖析了C++ Boost库中shared_ptr的实现原理。通过详细的代码示例介绍了shared_ptr的内部结构,包括智能指针类shared_ptr, 共享计数器shared_count, 以及基类sp_counted_base和派生类sp_counted_impl_xx与sp_counted_impl_yy的职责分工。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++boost库里面有许多好用的指针,其中以shared_ptr最为复杂,也最为像普通指针,下面简单的剖析一下shared_ptr的框架。


  config.h
 1 #pragma once
  2
  3
  4 //#define DISPLAY
  5 #define SP_COUNTED_IMPL_XX
  6 //#define SP_COUNTED_IMPL_YY

smart_ptr.h  
 1
  2
  3
  4 #pragma once
  5
  6 #include"shared_ptr.h"

shared_ptr.h  
1 #ifndef _SHARED_PTR_H
  2 #define _SHARED_PTR_H
  3
  4 #include"./shared_count.h"
  5
  6 template<class T>
  7 class shared_ptr
  8 {
  9 public:
 10     shared_ptr(T *p = 0):px(p),pn(p)
 11     {
 12         #ifndef DISPLAY
 13         cout<<"Create shared_ptr"<<endl;
 14         #endif
 15     }
 16     ~shared_ptr()
 17     {
 18     #ifndef DISPLAY
 19         cout<<"Free shared_ptr Object"<<endl;
 20     #endif
 21     }
 22 private:
 23     T *px;          //指针
 24     shared_count pn;    //共享类型计数器
 25 };
 26
 27 #endif
shared_count.h  
1 #ifndef _SHARED_COUNT_H
  2 #define _SHARED_COUNT_H
  3
  4 #include"./sp_counted_base.h"
  5 #include"./sp_counted_impl_xx.h"
  6 #include"./sp_counted_impl_yy.h"
  7
  8 class shared_count
  9 {
 10 private:
 11     sp_counted_base *pi_;   //一个父类对象 可以直接,可以用子类实现
 12 public:
 13     shared_count():pi_(0)
 14     {
 15         cout<<"Create shared_count Object"<<endl;
 16     }
 17 //  template<class Y>
 18 //  shared_count(Y *p):pi_(new sp_counted_impl_xx<Y>(p))
 19     template<class Y>
 20     shared_count(Y *p)
 21     {
 22     #ifndef DISPLAY
 23         cout<<"Create shared_count Object"<<endl;
 24     #endif
 25     //动态 定义了哪个子类 就用哪个子类去实现
 26     #ifndef SP_COUNTED_IMPL_XX
 27         pi_ = new sp_counted_impl_xx<Y>(p);
 28     #else
 29         pi_ = new sp_counted_impl_yy<Y>(p);
 30     #endif
 31     }
 32     virtual ~shared_count()
 33     {
 34     #ifndef DISPLAY
 35         cout<<"Free shared_count Object"<<endl;
 36     #endif
 37         if(pi_ != 0)    //如果所指向的不为空的话
 38                         //调用相应的释放函数
 39             pi_->realease();
 40     }
 41
 42 };
 43
 44 #endif
  sp_counted_base.h
1 #pragma once
  2
  3 #include<iostream>
  4 using namespace std;
  5 #include"./config.h"
  6
  7
  8 class sp_counted_base
  9 {
 10 public:
 11     sp_counted_base():use_count_(1)
 12     {
 13     #ifndef DISPLAY
 14         cout<<"Create sp_counted_base Object"<<endl;
 15     #endif
 16     }
 17     ~sp_counted_base()
 18     {
 19     #ifndef DISPLAY
 20         cout<<"Free sp_counted_base Object"<<endl;
 21     #endif
 22     }
 23 public:
 24 virtual void dispose() = 0;
 25     void realease()//引用计数器减一 如果为0 调用摧毁函数
 26     {
 27         if(--use_count_ == 0)
 28         {
 29             this->dispose();
 30         }
 31     }
 32 private:
 33     long use_count_;    //父类有一个引用计数器
 34 };

sp_counted_impl.h  
1 #pragma once
  2
  3 #include"./sp_counted_base.h"
  4
  5 template<class X>
  6 class sp_counted_impl_xx:public sp_counted_base
  7 {
  8 private:
  9     X * px_;    //子类有相应的指针
 10 public:
 11     sp_counted_impl_xx(X *px):px_(px)
 12     {
 13     #ifndef DISPLAY
 14         cout<<"Create sp_counted_impl_xx Object"<<endl;
 15     #endif
 16     }
 17     ~sp_counted_impl_xx()
 18     {
 19     #ifndef DISPLAY
 20         cout<<"Free sp_counted_impl_xx Object"<<endl;
 21     #endif
 22     delete px_;
 23     }
 24     virtual void dispose()
 25     {
 26         //  delete px_;
 27         #ifndef DISPLAY
 28         cout<<"THis is sp_counted_impl_xx:dispose()"<<endl;
 29         #endif
 30         delete this;
 31     }
 32 }
 33 ;

sp_counted_impl_yy.h 
 1 #pragma once
  2
  3 #include"./sp_counted_base.h"
  4
  5 template<class X>
  6 class sp_counted_impl_yy:public sp_counted_base
  7 {
  8 private:
  9     X * px_;
 10 public:
 11     sp_counted_impl_yy(X *px):px_(px)
 12     {
 13     #ifndef DISPLAY
 14         cout<<"Create sp_counted_impl_yy Object"<<endl;
 15     #endif
 16     }
 17     ~sp_counted_impl_yy()
 18     {
 19     #ifndef DISPLAY
 20         cout<<"Free sp_counted_impl_yy Object"<<endl;
 21     #endif
 22     delete px_;
 23     }
 24     virtual void dispose()
 25     {
 26         //  delete px_;
 27         #ifndef DISPLAY
 28         cout<<"This is sp_counted_impl_yy:dispose()"<<endl;
 29         #endif
 30         delete this;
 31     }
 32 }
 33 ;


  Main.cpp
 1 #include<iostream>
  2 #include"./smart_ptr.h"
  3 using namespace std;
  4
  5 int main()
  6 {
  7     int *p = new int(10);
  8     shared_ptr<int> pa(p);
  9     return 0;
 10 }


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值