您的位置:首页 > 其它

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

2017-06-18 15:02 483 查看
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>
4000
;
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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: